2009-04-13 3 views
5

mio Ruby on Rails applicazione utilizza il seguente codice di controllo per generare un file sitemap.xml:Stantio delle rotaie? metodo per la mappa del sito restituisce sempre 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 

La mia comprensione è che il metodo stale? dovrebbe garantire un HTTP 304 risposta non modificato se il contenuto non è cambiato. Tuttavia, ogni volta che testare questo utilizzando curl o un browser Web ottengo sempre un 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 

sto utilizzando il metodo stale? correttamente? È persino possibile testarlo localmente?

risposta

4

è probabile che il codice Rails sia corretto, ma l'arricciatura non invia l'intestazione If-Modified-Since quando si esegue il test. Dal curl docs:

CONDIZIONI DI TEMPO

HTTP consente a un client di specificare una condizione di tempo per il documento IT richieste. È If-Modified-Since o If-Unmodified-Since. Curl ti consente di specificare con il flag -z/- time-cond .

Ad esempio, si può facilmente fare un download che viene eseguita solo se il file remoto è più recente di un copia locale. Si sarebbe reso come:

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

Oppure si può scaricare un file solo se il file locale è più recente il telecomando uno. A tale scopo, anteponendo la stringa della data con un '-', come in:

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

è possibile specificare un "testo libero" data condizione. Dillo curl per scaricare solo il file se è stato aggiornato dal ieri:

ricciolo -z ieri http://remote.server.com/remote.html

Curl sarà quindi accettare una vasta gamma di formati di data . Si fa sempre la data controllando il contrario da anticipandolo con un trattino '-'.

+0

Grazie Adam, è stato. –

+0

È grandioso, speravo che sarebbe stato utile per te. Grazie per l'aggiornamento! –