Rails' stantio? metodo per la mappa del sito restituisce sempre HTTP 200
-
09-09-2019 - |
Domanda
Il mio Ruby on Rails applicazione utilizza il seguente codice di controllo per generare un file 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
La mia comprensione è che il metodo stale?
dovrebbe garantire un HTTP 304 risposta Not Modified se il contenuto non è cambiato. Tuttavia, ogni volta che provo questa 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 usando il metodo stale?
correttamente? E 'anche possibile testare questo locale?
Soluzione
è probabile che il codice Rails è bene, ma ricciolo non sta inviando il If-Modified-Since quando si esegue il test. Dal ricciolo docs :
CONDIZIONI TEMPO
HTTP consente a un client di specificare un tempo condizioni per il documento che richieste. E 'If-Modified-Since o Se-non modificato-Since. Arricciatura permetterà di specificarli con l'-z / - time-cond bandiera.
Ad esempio, si può facilmente fare un download che viene eseguito se solo il file remoto è più recente di un locale copia. Si sarebbe reso come:
ricciolo -z local.html http://remote.server.com/remote.html
In alternativa, è possibile scaricare un file solo se il file locale è più recente il telecomando uno. A tale scopo, anteponendo la data stringa con un '-', come in:
ricciolo -z -local.html http://remote.server.com/remote.html
È possibile specificare una data "testo libero", come 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. Fai sempre la data verifica il contrario per anteponendo con un trattino '-'.