在Rails视图中使用fresh_when strong_etag: @collection
时,etag会在被Apache压缩之前生成,因此它缺少“ -gzip”后缀。
但是,如果将Apache设置为gzip响应,则浏览器发送的Etag将包含“ -gzip”后缀。
这可能会或可能不会与使用Phusion Passenger作为Rails的代理服务器有关。
建议的解决方案包括让Apache通过在站点的指令中添加RequestHeader edit "If-None-Match" "^(.*)-gzip$" "$1"
来去除“ -gzip”后缀。但是,这似乎无法正常工作。
还有另一种方法可以重写标头以除去后缀,以便成功比较Etags?
答案 0 :(得分:0)
这可以通过在Rails中向应用程序控制器添加before_action
(以影响所有请求)来实现。
class ApplicationController < ActionController::Base
before_action :fix_etag_header
...
private
def fix_etag_header
if request.headers["HTTP_IF_ONE_MATCH"]
request.headers["HTTP_IF_NONE_MATCH"].sub! "-gzip", ""
end
end
end
很明显,这绕过了指令,即压缩的资源应具有来自未压缩的同一资源的唯一Etag的指令。如果HTTP请求的这些方面被其他代码更改或解决,则可能会导致问题。
但是,在大多数情况下,这是一个“足够好”的解决方案,尤其是考虑到仅需要6行时。