12

我的控制器中有一个使用 send_data 的方法,如下所示:

def show
  expires_in 10.hours, :public => true
  send_data my_image_generator, :filename => "image.gif", :type => "image/gif"
end

使用 expires_in 会导致像这样发送标头:

HTTP/1.1 200 OK
Connection: close
Date: Fri, 25 Jun 2010 10:41:22 GMT
ETag: "885d75258e9306c46a5dbfe3de44e581"
Content-Transfer-Encoding: binary
X-Runtime: 143
Content-Type: image/gif
Content-Disposition: inline; filename="image.gif"
Content-Length: 1277
Cache-Control: max-age=36000, public

我想做的是添加一个标题,Expires: (some exact date)以防止用户代理重新验证。但我看不到如何让 send_data 设置该标头?

我想我可以response.headers哈希中明确设置它,但肯定必须有一个包装器(或其他东西)?

4

3 回答 3

29

我遇到了这种语法,我喜欢它:-)

response.headers["Expires"] = 1.year.from_now.httpdate
于 2012-07-04T06:47:43.063 回答
11

显然似乎没有办法将 expires 传递给 send_data - 相反,您必须自己设置它response.headers 注意适当地格式化日期:

response.headers["Expires"] = CGI.rfc1123_date(Time.now + period)

请注意,如果两者都存在,则标头中的max-age指令Cache-Control会覆盖标头。有关详细信息,Expires请参阅RFC2616 第 14.9.3 节。

于 2010-09-20T23:54:47.020 回答
3

您问题中的代码实际上应该适用于最近的 Rails:

`expires_in 10.hours, :public => true`
于 2014-02-06T14:35:29.773 回答