2009-04-13 27 views
5

我的Ruby on Rails的應用程序使用以下控制器代碼,以生成一個sitemap.xml的文件:Rails的陳舊?對於站點地圖方法總是返回HTTP 200

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未修改響應內容沒有改變。但是,每當我測試這個使用捲曲或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??它甚至有可能在本地進行測試嗎?

回答

4

很可能您的Rails代碼很好,但是當您執行測試時,curl並未發送If-Modified-Since標頭。從curl docs

時間等條件

HTTP允許客戶爲其指定 請求該文檔的時間 條件。它是If-Modified-Since或者If-Unmodified-Since。捲曲讓你 用-z/- time-cond 標誌指定它們。

例如,您可以輕鬆地進行 下載,只有在 遠程文件比本地 副本更新時才能執行下載。它會作出這樣的:

捲曲-z local.html http://remote.server.com/remote.html

或者只在 本地文件比遠程 一個較新的,你可以下載一個文件。 「 - 」在前面加上日期 字符串以做到這一點,如:

捲曲-z -local.html http://remote.server.com/remote.html

你可以指定一個「自由文本」日期 條件。告訴捲曲只下載 該文件,如果有人因爲 昨天更新:

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

然後捲曲將接受廣泛的 日期格式。你總是讓日期 檢查 其他方式前面加一個破折號' - '。

+0

謝謝亞當,就是這樣。 – 2009-04-14 14:41:43

相關問題