我的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
我的理解是,如果内容未更改,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?
方法?甚至可以在本地进行测试吗?
答案 0 :(得分:4)
你的Rails代码可能很好但是curl在你执行测试时没有发送If-Modified-Since标头。来自curl docs:
时间条件
HTTP允许客户端指定时间 它的文件条件 要求。它是If-Modified-Since或 如果未修饰的,因为。卷曲允许你 使用-z / - time-cond指定它们 标志。
例如,您可以轻松制作一个 下载只有在执行时才会执行 远程文件比本地文件更新 复制。它会像:
curl -z local.html http://remote.server.com/remote.html
或者你只能在下载文件时使用 本地文件比远程文件更新 一。通过预先设定日期来做到这一点 带有' - '的字符串,如:
curl -z -local.html http://remote.server.com/remote.html
您可以指定“自由文本”日期 条件。告诉curl只下载 如果文件已更新,则该文件 昨天:
昨天卷曲-z http://remote.server.com/remote.html然后Curl会接受各种各样的 日期格式。你总是约会 检查相反的方式 在它前面添加一个破折号' - '。