Raíles rancio? Mapa del sitio método para siempre devuelve HTTP 200
-
09-09-2019 - |
Pregunta
Mi Ruby on Rails aplicación utiliza el siguiente código de controlador para generar un archivo 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
Mi entendimiento es que el método stale?
debe garantizar una respuesta HTTP 304 No modificado si el contenido no ha cambiado. Sin embargo, cada vez que probar esto usando rizo o un navegador web Siempre tengo 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
¿Estoy usando el método stale?
correctamente? ¿Es posible poner a prueba esta a nivel local?
Solución
lo más probable es que su código de Rails es muy bien, pero rizo no está enviando el Si-Modified-Since encabezado cuando se realiza la prueba. Desde el rizo docs :
Las condiciones de tiempo
HTTP permite a un cliente especificar una hora condición para que el documento se peticiones. Es If-Modified-Since o Si-no modificado-Puesto. Curl permitirá especificarlos con el -z / - Tiempo-cond bandera.
Por ejemplo, se puede hacer fácilmente una descarga que sólo se pone a cabo si el archivo remoto es más reciente que un local de Copiar. Se haría como:
rizo -z local.html http://remote.server.com/remote.html
O se puede descargar un archivo sólo si el archivo local es más reciente que el control remoto uno. Para ello, anteponiendo la fecha cadena con un '-', como en:
rizo -z -local.html http://remote.server.com/remote.html
Puede especificar un "texto libre" como fecha condición. Dile a curl para descargar solamente el archivo si se actualiza desde Ayer:
-z rizo ayer http://remote.server.com/remote.html
Curl entonces aceptar una amplia gama de formatos de fecha. Siempre haces la fecha comprobar el revés por anteponiendo con un guión '-'.