5

我的 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 正常
连接:关闭
日期:2009 年 4 月 13 日星期一 15:50:00 GMT
最后修改时间:格林威治标准时间 2009 年 4 月 8 日星期三 16:52:07
X-运行时:100
ETag:“5ff2ed60dddcdecf291e7191e1ad540f6”
缓存控制:私有,max-age=0,必须重新验证
内容类型:应用程序/xml;字符集=utf-8
内容长度:29318

stale?是否正确使用该方法?甚至可以在本地进行测试吗?

4

1 回答 1

4

您的 Rails 代码可能很好,但 curl 在您执行测试时没有发送 If-Modified-Since 标头。来自curl 文档

时间条件

HTTP 允许客户端为其请求的文档指定时间条件。它是 If-Modified-Since 或 If-Unmodified-Since。Curl 允许您使用 -z/--time-cond 标志指定它们。

例如,您可以轻松地进行仅在远程文件比本地副本更新时才执行的下载。它会像这样:

curl -z local.html http://remote.server.com/remote.html

或者,仅当本地文件比远程文件新时,您才可以下载文件。通过在日期字符串前面加上“-”来做到这一点,如下所示:

curl -z -local.html http://remote.server.com/remote.html

您可以指定“自由文本”日期作为条件。告诉 curl 只下载从昨天开始更新的文件:

curl -z 昨天 http://remote.server.com/remote.html

然后,Curl 将接受各种日期格式。您总是通过在日期前面加上破折号'-'来反过来检查日期。

于 2009-04-14T14:24:15.997 回答