代码之家  ›  专栏  ›  技术社区  ›  Daniel

Ruby on Rails,如何禁用/关闭etag

  •  8
  • Daniel  · 技术社区  · 16 年前

    问候语,

    如何关闭RubyonRails 2.3.5版中的etag?

    当我直接向ror/mongrel请求时,会出现etag头。

    蒂亚

    -丹尼尔

    6 回复  |  直到 10 年前
        1
  •  21
  •   tokland    13 年前

    容易得多:

    config.middleware.delete Rack::ETag
    
        2
  •  5
  •   gucki    16 年前

    放 response.etag = nil 在前置过滤器中不起作用。ETag是在发送响应之前生成的(它是从主体计算出来的,所以在完成所有渲染之后)。

    禁用etag使用和生成(从而节省在MD5中花费的时间)的正确解决方案是:

    module ActionController
      class Request
        # never match any incomming etag
        def etag_matches?(etag)
          false
        end
      end
    
      class Response
        # fake rails that our response already has an etag set and so none is generated automatically
        def etag?
          true
        end
      end
    end
    
        3
  •  1
  •   John Topley    16 年前

    有一个 etag 上的setter方法 ActionController::Response 对象,如果etag-http头为空,它将删除该头,因此您应该能够在控制器中清除它(可能在before过滤器中):

    response.etag = nil
    
        4
  •  0
  •   Toby Hede    16 年前

    我不认为他们是默认的。

    我的理解是需要使用stale明确地设置它们?/呼叫时保持新鲜或类似。

        5
  •  0
  •   Chris Broski    10 年前

    我在Webrick的Rails4中工作,试图得到对缓存的响应,直到它每天在特定时间到期。看起来自动生成的etag正在干扰过期缓存,这就是我搜索这个答案的原因。我在这里没有发现任何有用的东西,但我确实解决了我的问题,所以我会分享。

    tl;dr设置 Last-Modified 标题

    但设置为什么?在我的情况下,我试图优化一个Web服务,该服务返回每天同时运行的进程的结果。我的响应头结果如下所示:

    response.headers['Cache-Control'] = "max-age=86400"
    response.headers['Expires'] = getCacheTime
    response.headers['Last-Modified'] = getLastModified
    

    首先你要明确地写 Cache-Control 头覆盖默认值。我将我的设置为24小时,以符合我的到期标题的最大值。我用一个类似这样的函数设置了到期标题:

    def getCacheTime
        now = Time.now.utc
        cacheTime = Time.utc(now.year, now.month, now.day, 22, 00, 00)
        if now > cacheTime
            cacheTime = cacheTime + (60 * 60 * 24)
        end
    
        cacheTime.httpdate
    end
    

    这个 GETLAST修饰 函数返回的时间正好比 获取时间 功能。至少在我当前的开发环境中,设置这个选项会抑制etag(另一个验证缓存头)。

        6
  •  -1
  •   Kris    16 年前

    为什么不在应用程序控制器中添加一个before_过滤器,它将etag设置为nil?

    推荐文章