为什么在使用Safari和Apache 2.2.3获取Javascript /图像资源时,某些页面请求会挂起?

我们的Ruby on Rails应用程序的一些用户抱怨说,页面请求偶尔会在Safari下无限期地挂起(一对夫妇已经注意到它在Firefox下,但绝大多数是Safari用户)。 经过一番调查,似乎这些请求被我们的Rails应用程序正确地提供,并且在提取HTML中引用的图像资源(托pipe在同一服务器上)时发生挂起。

我们已经configurationApache直接提供图片资源,并绕过Rails应用程序的性能。 我们还启用了text / javascript / css资源上的gzip压缩。 下面是我们的Apache虚拟主机configuration的相关设置 – 也许我们已经configuration了这种方式,可以解释这些任意挂起的请求?

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 +祷告选择键,同时按下Reload按钮。 这花了我一段时间才弄清楚,直到我明白了,我一直难以一再重现这个问题。

所以! 没有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-Hang-A-Lot模式。

为什么? 我不知道。 但是这是我如何解决这个问题。

奥利,

这可能是也可能不是相关的,但是浏览器的限制是2(默认)他们可以进行同时连接。 如果有连接保持打开通信,并且您也正在获取图像,则图像的调用可能不会通过,直到浏览器有一个空闲的规定的连接。 图像获取过程中的挂起可能实际上是由一些其他服务器连接触发的,这些服务器连接没有完成,或者由服务器和浏览器保持打开状态。 所以你可能实际上是在错误的地方狩猎。

如果您能够重现错误,请尝试切换到您的开发服务器上的HTTP 1.0,看看它是否解决了这个问题。 另外尝试移动一些资产到另一个域/子域,并从那里获取。

希望给你另一个角度。

问候,纳拉扬

Oaracle ias 10.1.3.4服务器在Windows中使用Safari 5.1进行浏览的同样的问题。

如果Safari浏览器(httpd.conf)禁用保持活动协商,则问题消失:

 BrowserMatch "Safari" nokeepalive 

我不确定真正的问题是什么,或者如果以前的解决方案是最好的,但是这个配置解决了这个问题。

我知道这是一个老话题,但我想分享一个Safari的解决方案,可能会节省一些时间。 下面这行确实解决了所有问题:

 BrowserMatch "^(?=.*Safari)(?=.*Macintosh)(?!.*Chrom).*" nokeepalive gzip-only-text/html 

正则表达式确保只有Mac上的Safari被检测到,而不是Mobile Safari和Chrome(ium)等等。 用于Windows的Safari也不匹配,但Keepalive问题似乎只是一个Mac-Safari组合。 另外,一些Safari版本不能很好地处理gzip的css / js。

我们的网站崩溃或CSS的所有症状都不能在不同版本的Safari中完成加载,这使得我几乎把头发拉出来(Safari真的是新的IE)已经为我们解决了这个Apache的“配置黑客”。

有些事情可能有帮助,没有特别的顺序:

  1. 使用资产主机,它们非常容易设置: http : //api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html
  2. 确保尽可能在页面底部附近加载Javascript。
  3. 确保Apache / Nginx /正确设置了Expires-In HTTP标头。
  4. 在Firefox下运行Google Speed Page,这将提供很多好的信息。