2009-04-13 9 views
5

Mon application Ruby on Rails utilise le code de commande suivante pour générer un fichier sitemap.xml:Rails 'périmé? méthode pour plan du site renvoie toujours 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 

Ma compréhension est que la méthode stale? doit assurer un HTTP 304 de réponse Non modifié si le contenu n'a pas changé. Cependant, chaque fois que je tester cela en utilisant la courbure ou un navigateur Web, je reçois toujours 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 

Suis-je utiliser correctement la méthode stale?? Est-il même possible de le tester localement?

Répondre

4

Il est probable que votre code Rails soit correct mais curl n'envoie pas l'en-tête If-Modified-Since lorsque vous effectuez votre test. De l'curl docs:

CONDITIONS DE TEMPS

HTTP permet à un client de spécifier un temps état du document, il demandes. Il est If-Modified-Since ou If-Unmodified-Since. Curl vous permet de les spécifier avec le drapeau -z/- time-cond .

Par exemple, vous pouvez facilement faire un téléchargement qui obtient seulement exécuté si le fichier distant est plus récent que la copie locale. Il serait fait comme:

boucle -Z local.html http://remote.server.com/remote.html

Ou vous pouvez télécharger un fichier que si le fichier local est plus récent que la à distance l'un. Pour ce faire, préfixer la date chaîne avec un '-', comme dans:

boucle -Z -local.html http://remote.server.com/remote.html

Vous pouvez spécifier une date "texte libre" comme condition. Dites-curl pour ne télécharger le fichier s'il a été mis à jour depuis hier:

curl hier http://remote.server.com/remote.html

Curl acceptera maintenant un large éventail de formats de date. Vous faites toujours la date vérifier l'inverse par en le précédant d'un tiret '-'.

+0

Merci Adam, c'était ça. –

+0

C'est génial, j'espérais que ça vous serait utile. Merci pour la mise à jour! –

Questions connexes