Joh*_*ley 5 ruby etag ruby-on-rails
我的Ruby on Rails应用程序使用以下控制器代码生成sitemap.xml文件:
class SitemapController < ApplicationController
layout nil
def index
headers['Content-Type'] = 'application/xml'
last_post = Post.last
if stale?(:etag => last_post, :last_modified => last_post.updated_at.utc)
respond_to do |format|
format.xml { @posts = Post.sitemap } # sitemap is a named scope
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我的理解是,stale?如果内容没有改变,该方法应该确保HTTP 304 Not Modified响应.但是,每当我使用curl或Web浏览器测试时,我总是得到一个HTTP 200:
$ curl --head localhost:3000/sitemap.xml HTTP/1.1 200 OK Connection: close Date: Mon, 13 Apr 2009 15:50:00 GMT Last-Modified: Wed, 08 Apr 2009 16:52:07 GMT X-Runtime: 100 ETag: "5ff2ed60ddcdecf291e7191e1ad540f6" Cache-Control: private, max-age=0, must-revalidate Content-Type: application/xml; charset=utf-8 Content-Length: 29318
我stale?正确使用该方法吗?甚至可以在本地进行测试吗?
您的 Rails 代码可能没问题,但在执行测试时,curl 没有发送 If-Modified-Since 标头。来自卷曲文档:
时间条件
HTTP 允许客户端为其请求的文档指定时间条件。它是 If-Modified-Since 或 If-Unmodified-Since。Curl 允许您使用 -z/--time-cond 标志来指定它们。
例如,您可以轻松进行下载,仅当远程文件比本地副本新时才执行下载。它会被做成这样:
卷曲 -z local.html http://remote.server.com/remote.html
或者,仅当本地文件比远程文件新时,您才可以下载文件。为此,请在日期字符串前面添加“-”,如下所示:
卷曲 -z -local.html http://remote.server.com/remote.html
您可以指定“自由文本”日期作为条件。告诉curl 仅下载自昨天以来已更新的文件:
昨天curl -z http://remote.server.com/remote.html
然后,Curl 将接受多种日期格式。您始终可以通过在日期前添加破折号“-”来以相反的方式检查日期。
| 归档时间: |
|
| 查看次数: |
1794 次 |
| 最近记录: |