带有Phusion / Apache 2.4的Rails 5中的Etags

时间:2019-05-19 21:59:55

标签: passenger apache2.4 ruby-on-rails-5.2

在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?

1 个答案:

答案 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行时。