¿Cómo modifico el encabezado Last-Modified en nginx?

8

Mi servidor devuelve los siguientes encabezados:

Cache-Control:no-cache
Connection:keep-alive
Date:Thu, 07 Jul 2011 10:41:57 GMT
Expires:Thu, 01 Jan 1970 00:00:01 GMT
Last-Modified:Thu, 07 Jul 2011 08:06:32 GMT
Server:nginx/0.8.46`

Quiero que el contenido que estoy sirviendo no se almacene en caché, así que estoy buscando una forma de devolver un encabezado de Última modificación que contenga la fecha y hora en que se originó la solicitud. Algo así como ahora () ...

evilpenguin
fuente

Respuestas:

10

"Deseo que el contenido que estoy sirviendo no se almacene en caché": puede desactivar la If-Modified-Sinceverificación de encabezado de solicitud con la if_modified_since off;directiva. if_modified_since doc

Y sobre el Last-Modifiedencabezado: puede desactivarlo conadd_header Last-Modified "";

Codificador casual
fuente
1
No puede desactivar los encabezados con add_header , solo puede agregarlos. De la entrada: Tenga en cuenta que solo agrega una nueva entrada de encabezado a la lista de encabezados de salida. Por lo tanto, no puede usar esta directiva para reescribir encabezados existentes como Servidor. Use el módulo headers_more para ello.
kolbyjack
Lo he comprobado con curl -Dy después de agregar add_header Last-MOdified "";a mi nginx.conf, el Last-Modifiedencabezado ya no está allí en el archivo de volcado.
Casual Coder
1
Wow, mirando la fuente, Cache-Control y Last-Modified están en mayúsculas especiales y se establecerán en lugar de agregar una entrada adicional. Parece que la wiki necesita ser actualizada.
kolbyjack
1
Me equivoqué de nuevo, Cache-Control tiene una carcasa especial, pero no se sobrescribe, solo tiene que agregarse de una manera especial. Solo Última modificación establece el encabezado en lugar de agregar uno nuevo.
kolbyjack
Es bueno saber, ¿podrías señalarme un archivo? ¿Está adentro src/http/ngx_http_header_filter_module.c?
Casual Coder
6

Es posible que desee que parezca que un archivo siempre se modifica:

add_header Last-Modified $date_gmt;
if_modified_since off;
etag off;

En cuanto a la última línea, si realmente desea ocultar una verdadera fecha de última modificación, también debe ocultar el ETagencabezado ya que tiene marcas de tiempo .

sanmai
fuente
0

Honestamente, he pasado todo un día en esto y no estoy más cerca de lograr que Nginx siga correctamente, especialmente con la forma en que Nginx formatea incorrectamente el encabezado Last-Modified: Date que no está dentro de los RFC para un encabezado Last-Modified.

Sin embargo, encontré esta solución que, si está utilizando PHP, funciona bien y puede ajustarse según lo necesite. Espero eso ayude. Simplemente incluya esto en la parte superior de sus páginas .php antes del resto de su código.

<?php
//get the last-modified-date of this very file
$lastModified=filemtime(__FILE__);
//get a unique hash of this file (etag)
$etagFile = md5_file(__FILE__);
//get the HTTP_IF_MODIFIED_SINCE header if set
$ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
//get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash)
$etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);

//set last-modified header
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
//set etag-header
//header("Etag: $etagFile");
header("ETag: \"$etagFile\"");
//make sure caching is turned on
header('Cache-Control: private, must-revalidate, proxy-revalidate, max-age=3600');

//check if page has changed. If not, send 304 and exit
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])==$lastModified || $etagHeader == $etagFile)
{
       header("HTTP/1.1 304 Not Modified");
       header("Vary: Accept-Encoding");
       exit;
}
?>

Luego pruebe su sitio en redbot.org y www.hscripts.com

ACTUALIZAR:

  1. Se agregó el envío del encabezado de variación con la respuesta 304 no modificada (requerido)
  2. Caché modificada: el encabezado de control max-age se puede ajustar a sus propias necesidades.
  3. Para dar crédito donde es debido, encontré la solución aquí y la modifiqué un poco: https://css-tricks.com/snippets/php/intelligent-php-cache-control/
MitchellK
fuente