2009-04-13 4 views
5

Meinen Ruby on Rails-Anwendung den folgenden Controller-Code verwendet eine sitemap.xml-Datei zu generieren:Schienen alt? Verfahren zur Sitemap gibt immer 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 

Mein Verständnis ist, dass die stale? Methode eine HTTP 304 nicht geändert Antwort sicherstellen soll, wenn Der Inhalt hat sich nicht geändert. wenn ich jedoch testen diese mit curl oder einen Web-Browser ich immer eine HTTP-200 erhalten:

 
$ 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 

Bin ich richtig stale? Methode? Ist es sogar möglich, das lokal zu testen?

Antwort

4

Es ist wahrscheinlich, dass Ihr Rails-Code in Ordnung ist, aber curl sendet den If-Modified-Since-Header nicht, wenn Sie Ihren Test durchführen. Vom curl docs:

ZEIT BEDINGUNGEN

HTTP ermöglicht es einem Client eine Zeit Bedingung für das Dokument, um es Anfragen zu spezifizieren. Es ist If-Modified-Since oder If-Unmodified-Since. Curl können Sie mit dem -z/- Time-Cond Flag angeben.

Zum Beispiel können Sie ganz einfach ein herunterladen, die nur ausgeführt werden, wenn die Remote-Datei neuer ist als eine lokale Kopie ist.

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

Oder Sie können nur eine Datei herunterladen, wenn die lokale Datei neuer als die Remote- ist: Es wäre wie gemacht werden. Tun Sie dies durch das Voranstellen das Datum String mit einem '-', wie in:

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

Sie können festlegen, einen "freien Text" Datum als Zustand. Sagen Sie curl nur die Datei herunterladen, wenn sie seit gestern wurde aktualisiert:

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

Locke wird dann eine große Auswahl an Datumsformate akzeptieren. Sie machen immer das Datum überprüfen Sie den umgekehrten Weg von vor es mit einem Strich '-'.

+0

Danke Adam, das war es. –

+0

Das ist großartig, ich hatte gehofft, es wäre hilfreich für dich. Danke für das Update! –

Verwandte Themen