Come posso modificare l'intestazione Ultima modifica su nginx?


8

Il mio server restituisce le seguenti intestazioni:

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`

Voglio che il contenuto che sto servendo non sia memorizzato nella cache, quindi sto cercando un modo per restituire un'intestazione Ultima modifica che contiene la data e l'ora in cui la richiesta è stata originata. Qualcosa come adesso () ...

Risposte:


10

"Voglio che il contenuto che sto servendo non sia memorizzato nella cache": puoi disattivare il If-Modified-Sincecontrollo dell'intestazione della richiesta con la if_modified_since off;direttiva. if_modified_since doc

E sull'intestazione Last-Modified: puoi disattivarlo conadd_header Last-Modified "";


1
Non puoi disattivare le intestazioni con add_header , puoi solo aggiungerle. Dalla voce: si noti che aggiunge semplicemente una nuova voce di intestazione all'elenco delle intestazioni di output. Quindi non puoi usare questa direttiva per riscrivere le intestazioni esistenti come Server. Usa il modulo headers_more per questo.
kolbyjack,

L'ho verificato con curl -De dopo l'aggiunta add_header Last-MOdified "";al mio nginx.conf, l' Last-Modifiedintestazione non è più presente nel file di dump.
Casual Coder

1
Wow, guardando l'origine, Cache-Control e Last-Modified sono in maiuscolo e verranno impostati invece di aggiungere una voce aggiuntiva. Sembra che il wiki debba essere aggiornato.
kolbyjack,

1
Ho sbagliato di nuovo, Cache-Control ha un case speciale, ma non sovrascrive, deve solo essere aggiunto in un modo speciale. Solo Last-Modified imposta l'intestazione invece di aggiungerne una nuova.
kolbyjack,

Buono a sapersi, potresti indicarmi un file? È dentro src/http/ngx_http_header_filter_module.c?
Casual Coder

6

Potresti voler far sembrare che un file sia sempre modificato:

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

Per quanto riguarda l'ultima riga, se vuoi davvero nascondere una vera data dell'ultima modifica, allora devi nascondere anche l' ETagintestazione poiché perde i timestamp .


0

Onestamente ho trascorso un'intera giornata su questo e non più vicino a far giocare Nginx correttamente, specialmente con il modo in cui Nginx formatta erroneamente l'intestazione Last-Modified: Date che non è all'interno della RFC per un'intestazione Last-Modified.

Ho trovato questa soluzione, tuttavia, che, se si utilizza PHP, funziona perfettamente e può essere ottimizzata in base alle proprie esigenze. Spero che sia d'aiuto. Basta includerlo nella parte superiore delle pagine .php prima del resto del codice.

<?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;
}
?>

Quindi prova il tuo sito su redbot.org e www.hscripts.com

AGGIORNARE:

  1. Aggiunto invio dell'intestazione di variazione con la risposta 304 non modificata (richiesto)
  2. Cache modificata: l'intestazione di controllo max-age può essere modificata in base alle proprie esigenze.
  3. Per dare credito dove è dovuto, ho trovato la soluzione qui e l'ho modificata leggermente - https://css-tricks.com/snippets/php/intelligent-php-cache-control/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.