Rails的陈旧? sitemap的方法始终返回HTTP 200

时间:2009-04-13 16:01:05

标签: ruby-on-rails ruby etag

我的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?方法?甚至可以在本地进行测试吗?

1 个答案:

答案 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会接受各种各样的   日期格式。你总是约会   检查相反的方式   在它前面添加一个破折号' - '。