在Apache上使用Rails 3.1时,PageSpeed在使用Asset Pipeline apache配置时说"指定缓存验证器"

Tom*_*son 3 apache ruby-on-rails ruby-on-rails-3.1 asset-pipeline

我发现Rails 3.1指南建议与Google PageSpeed管理缓存资产的建议之间存在冲突.

导轨3.1导游资产管道提供一个解决方案Apache服务器的配置这里

apache配置的重要部分是:

<LocationMatch "^/assets/.*$">
  # Some browsers still send conditional-GET requests if there's a
  # Last-Modified header or an ETag header even if they haven't
  # reached the expiry date sent in the Expires header.
  Header unset Last-Modified
  Header unset ETag
  FileETag None
  # RFC says only cache for 1 year
  ExpiresActive On
  ExpiresDefault "access plus 1 year"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

一切正常,但是当我运行谷歌的PageSpeed,它抱怨说我应该"指定缓存验证"设置要么Last-Modified或者ETag,列出所有的资产文件夹中的文件.

评论Header unset Last-Modified满足PageSpeed.

我对各种页面加载进行了快速测试,至少在Chrome中,它似乎没有什么区别 - 资产是以任何方式缓存的.

有谁知道哪个合适?

Ric*_*lse 9

出于一致性的原因,该代码已从原始Rails帮助程序代码中剪切并粘贴.(是我复制了它).

我已经和史蒂夫·索德斯(感谢,史蒂夫)进行了核实,他说了以下内容:

你应该不会取消设置的Last-Modified.我打赌那个写过的人点击"重新载入"进行测试.当您单击"重新加载"时,您明确告诉浏览器发送条件GET.(见这个)

ETag有同样的问题(如果你点击"Reload"它将发送一个条件GET).但它有一个不同的问题,可能意味着你应该取消设置ETag.问题是Apache和IIS上的默认ETag语法导致不必要的验证失败和传输的浪费字节.您应该配置语法来解决这些问题,但是大多数人发现更容易取消设置ETag.(见这个)

我会更新Rails文档!