ruby-on-rails – 为什么在使用Safari和Apache 2.2.3获取Javascr
我们的
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运行. 更新: 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模式. 为什么?我不知道.但这就是我如何解决它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |