当使用send_data时,如何设置Expires标头

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: (某个确切日期)的头部信息,以防止用户代理重新验证。但我不知道如何让send_data设置那个头部信息?

我猜我可以在response.headers散列表中明确地设置它,但肯定有一个包装器(或其他东西)可以实现吧?

3个回答

29

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

response.headers["Expires"] = 1.year.from_now.httpdate

你是在 send_data 之前还是之后放置它? - kingsfoil
send_data 之前添加;一旦调用了 send_data,设置头部就没有意义了。 - Abdo
@NicolasGoy 你确定这是Rails的情况吗?(我刚试了一下Rails 4.2.0.beta4,它可以正常工作而不需要time - Abdo
这是因为 Rails 需要它。但是可以在 irb 中尝试一下。 - Nicolas Goy
无论如何,解决方案中都需要Rails/ActiveSupport中的from_now - mahemoff
显示剩余2条评论

11

看起来似乎没有办法将过期时间传递给send_data - 相反,您必须在response.headers中自己设置它,并且要注意适当地格式化日期:

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

请注意,如果同时存在Cache-Control头中的max-age指令和Expires头,则Cache-Control头中的max-age指令会覆盖Expires头。 有关更多详细信息,请参见RFC2616第14.9.3节


3

你提供的代码应该可以在最新版本的Rails上正常工作:

`expires_in 10.hours, :public => true`

4
在原始代码中,提问者难道不是做了这件事吗? - bredikhin
实际上我发现这在Rails 4.2上确实有效,也许Rails修复了一个bug?只要确保避免在同一方法中设置任何手动标头,它还有额外的好处,可以将其声明为公共的。 - mahemoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接