加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 为什么在使用Safari和Apache 2.2.3获取Javascr

发布时间:2020-12-17 03:25:48 所属栏目:百科 来源:网络整理
导读:我们的 Ruby on Rails应用程序的一些用户抱怨说,页面请求偶尔会在Safari下无限期挂起(一对夫妇在Firefox下注意到它,但它绝大多数都是Safari用户).经过一些调查后,我们的Rails应用程序似乎正确地提供了这些请求,并且在获取HTML中引用的图像资源(托管在同一服
我们的 Ruby on Rails应用程序的一些用户抱怨说,页面请求偶尔会在Safari下无限期挂起(一对夫妇在Firefox下注意到它,但它绝大多数都是Safari用户).经过一些调查后,我们的Rails应用程序似乎正确地提供了这些请求,并且在获取HTML中引用的图像资源(托管在同一服务器上)时发生挂起.

我们已将Apache配置为直接为图像资源提供服务,并绕过Rails应用程序以提高性能.我们还在text / javascript / css资产上启用了gzip压缩.以下是我们的Apache虚拟主机配置中的相关设置 – 也许我们已经以这样的方式配置了这可以解释这些任意挂起请求?

RewriteEngine On

# Correct behaviour of IE under SSL
SetEnvIf User-Agent ".*MSIE.*" 
    nokeepalive ssl-unclean-shutdown 
    downgrade-1.0 force-response-1.0

SSLEngine On
SSLCertificateFile /etc/httpd/conf/ssl/_.mycert.com.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/_. mycert.com.key
SSLCertificateChainFile /etc/httpd/conf/ssl/gd_bundle.crt

RequestHeader set X_ORIGINAL_PROTOCOL 'https'
RequestHeader set X_FORWARDED_PROTO 'https'

# Rewrite index to check for static
RewriteRule ^/$/index.html [QSA] 
RewriteRule "^/(images|stylesheets|javascripts|system)/?(.*)" "$0" [L]

# Rewrite to check for Rails cached page
RewriteRule ^([^.]+)$$1.html [QSA]

# Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html

ExpiresActive On
<FilesMatch ".(ico|gif|jpe?g|png|js|css)$">
  ExpiresDefault "access plus 1 year"
  Header append Cache-Control "public"
</FilesMatch>

以前有没有人遇到过类似的问题?

我们的Ruby on Rails Web应用程序在RedHat Enterprise Linux 5上使用mod_rails和Apache 2.2.3运行.

更新:
我现在尝试删除以下块,问题仍然存在,所以我们可以将expires头排除在问题之外:

ExpiresActive On
<FilesMatch ".(ico|gif|jpe?g|png|js|css)$">
  ExpiresDefault "access plus 1 year"
  Header append Cache-Control "public"
</FilesMatch>

解决方法

我今天在我们的网站上调试类似的问题非常愉快. Safari用户 – 但似乎只是Mac上的用户 – 会抱怨我们的网站在加载页面时会“随意”挂起.它通常似乎挂在一个图像上 – 完成了3个项目中的2个等等 – 但后来我在Safari,JavaScript和CSS中禁用了缓存,猜猜是什么?页面仍然挂起.

首先,关于Safari缓存的说明.即使您在“开发”菜单中选择了“禁用缓存”并从“Safari”菜单中选择了“清空缓存”,您仍然可以使用基于RAM的缓存.这意味着如果您真的想要模拟空缓存,则必须在每次请求时退出Safari,或者在按下“重新加载”按钮的同时按住Option Shift Prayer-To-Deity-of-Choice键.我花了一段时间才弄明白,直到我弄明白,我一直很难重复这个问题.

所以!没有JavaScript,CSS或图像,你还剩下什么?除了实际的HTML之外,并不多.这就是让我了解可能与压缩相关的事实.当然,在IIS 6.0中关闭压缩会导致页面立即加载.由于IIS 6.0没有基于用户代理关闭压缩的便捷方法,因此我使用IIRF(重写URL的ISAPI过滤器)来重写来自Safari的Accept-Encoding标头:

# Safari doesn't handle gzip compression properly; we turn it off by setting 
# the q value to zero for all agents identifying themselves as Safari
RewriteCond %{HTTP_USER_AGENT} Safari
RewriteHeader Accept-Encoding: .* *;q=0

问题似乎是如果Safari正在接收静态压缩内容(即服务器发送Content-Length标头),那么Safari处理它就好了.但是如果Safari正在接收动态压缩内容(也就是说,服务器正在提供由ASP.NET呈现的响应,并且内容长度在完成之前是未知的,那么服务器发送Transfer-Encoding:chunked)然后Safari进入Flaky Sir-Hangs-A-Lot模式.

为什么?我不知道.但这就是我如何解决它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读