【问题标题】:E-tags missing from response headers with rails 3.2 / nginx / phusion passanger带有 rails 3.2 / nginx / phusion 乘客的响应标头中缺少电子标签
【发布时间】:2013-06-27 18:42:47
【问题描述】:

我有一个非常简单的带有电子标签的控制器:

class EtagsController < ApplicationController
  before_filter :require_user

  def index
    if stale?(:etag => current_user)
      render :layout => false
    end
  end

end

当我在本地开发环境中运行它时,第一个请求是 200,响应中有一个 ETag。第二个请求提交了 ETag,我得到了预期的 304 响应。

但是,当它在我的暂存或生产环境中执行时,响应中没有 ETag。

以下是我的暂存环境中的请求和响应标头:

Request URL: /etags
Request Method:GET
Status Code:200 OK

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__utma=169165539.1455374302.1372358226.1372358226.1372358226.1; __utmb=169165539.1.10.1372358226; __utmc=169165539; __utmz=169165539.1372358226.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); user_credentials=4ffa15df84112d22434f121eed06c59a5c32cb9ab72cf6bf1e952a3993201b5dec2917a028d20d4b63c70a84c6a290c4d5c4673ce967efec6f139c161850bc37%3A%3A101; _session_id=d21671b70349653406442ee0716633b2
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36

Response Headers
Cache-Control:must-revalidate, private, max-age=0
Connection:keep-alive
Content-Encoding:gzip
Content-Length:65
Content-Type:text/html; charset=utf-8
Date:Thu, 27 Jun 2013 18:37:10 GMT
Server:nginx/1.4.1 + Phusion Passenger 3.0.19
Status:200
X-Powered-By:Phusion Passenger (mod_rails/mod_rack) 3.0.19
X-Rack-Cache:miss
X-Request-Id:620c1ab99a1af7b6dde62cee77fc59fe
X-Runtime:0.205884
X-UA-Compatible:IE=Edge,chrome=1

我很难过。 为什么我的暂存环境不尊重控制器中的 ETag?

涉及的技术:

  1. Phusion 乘客 3.0.19
  2. nginx 1.4.1
  3. Rails 3.2.13

谢谢

【问题讨论】:

  • 似乎将 nginx 回滚到 1.2.7 可以解决此问题。为什么?如何配置更高版本的 nginix 以允许 ETags?
  • 我在 PHP 应用程序中看到了同样的问题。不幸的是,在 1.4.1 中,如果 gzip 打开,ETag 将被剥离。不过1.2.7没有这个问题。

标签: ruby-on-rails ruby-on-rails-3 nginx passenger


【解决方案1】:

如果为 nginx 启用了 gzip,似乎 nginx > 1.3 将忽略来自应用程序服务器的电子标签。我们在 nginx 中没有找到允许我们从应用程序服务器传递电子标签并 gzip 响应的解决方案。我相信弱电子标签可能适用于此,但 nginx 目前不支持它们。

【讨论】:

    【解决方案2】:

    Nginx 仍然不支持弱 etag。也许在 1.7.x 中:

    http://forum.nginx.org/read.php?29,249380,249740#msg-249740

    这个答案提供了一种让你的中间件将强标签转换为弱标签的方法:

    Weak ETAGs in Rails?

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 2021-07-07
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多