Wie ändere ich den zuletzt geänderten Header in Nginx?

8

Mein Server gibt die folgenden Header zurück:

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`

Ich möchte, dass der Inhalt, den ich bereitstelle, nicht zwischengespeichert wird. Daher suche ich nach einer Möglichkeit, einen zuletzt geänderten Header zurückzugeben, der das Datum und die Uhrzeit enthält, zu der die Anforderung erstellt wurde. So etwas wie jetzt () ...

evilpenguin
quelle

Antworten:

10

"Ich möchte, dass der Inhalt, den ich bereitstelle, nicht zwischengespeichert wird": Sie können die If-Modified-SinceÜberprüfung des Anforderungsheaders mit der if_modified_since off;Direktive deaktivieren. if_modified_since doc

Und zum Last-ModifiedHeader: Sie können es mit ausschaltenadd_header Last-Modified "";

Casual Coder
quelle
1
Sie können Header mit add_header nicht deaktivieren , sondern nur hinzufügen. Aus dem Eintrag: Beachten Sie, dass nur ein neuer Header-Eintrag an die Ausgabe-Header-Liste angehängt wird. Sie können diese Anweisung also nicht verwenden, um vorhandene Header wie Server neu zu schreiben. Verwenden Sie dazu das Modul headers_more .
Kolbyjack
Ich habe es mit überprüft curl -Dund nach dem Hinzufügen add_header Last-MOdified "";zu meiner nginx.conf ist der Last-ModifiedHeader nicht mehr in der Dump-Datei vorhanden.
Casual Coder
1
Wow, wenn man sich die Quelle ansieht, Cache-Control und Last-Modified sind spezielle Gehäuse und werden festgelegt, anstatt dass ein zusätzlicher Eintrag hinzugefügt wird. Es scheint, dass das Wiki aktualisiert werden muss.
Kolbyjack
1
Ich habe mich wieder geirrt, Cache-Control ist ein spezielles Gehäuse, aber es überschreibt nicht, es muss nur auf spezielle Weise hinzugefügt werden. Nur Last-Modified setzt den Header, anstatt einen neuen hinzuzufügen.
Kolbyjack
Gut zu wissen, können Sie mich auf eine Datei verweisen? Ist es in src/http/ngx_http_header_filter_module.c?
Casual Coder
6

Möglicherweise möchten Sie, dass eine Datei immer geändert wird:

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

Wenn Sie in der letzten Zeile wirklich ein echtes Datum der letzten Änderung ausblenden möchten, müssen Sie auch die ETagKopfzeile ausblenden, da dadurch Zeitstempel verloren gehen .

Sanmai
quelle
0

Ich habe ehrlich gesagt einen ganzen Tag damit verbracht und bin nicht näher dran, Nginx dazu zu bringen, richtig mitzuspielen, insbesondere mit der Art und Weise, wie Nginx den Header "Last-Modified: Date" falsch formatiert, der nicht in den RFCs für einen Header "Last-Modified" enthalten ist.

Ich habe jedoch diese Lösung gefunden, die, wenn Sie PHP verwenden, einwandfrei funktioniert und nach Bedarf angepasst werden kann. Ich hoffe es hilft. Fügen Sie dies einfach ganz oben auf Ihren .php-Seiten vor dem Rest Ihres Codes ein.

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

Dann testen Sie Ihre Website unter redbot.org und www.hscripts.com

AKTUALISIEREN:

  1. Das Senden des Variate-Headers mit der nicht geänderten Antwort 304 wurde hinzugefügt (erforderlich).
  2. Modifizierter Cache: Das maximale Alter des Steuerkopfs kann an Ihre eigenen Bedürfnisse angepasst werden.
  3. Um Kredit zu geben, wo er fällig ist, habe ich die Lösung hier gefunden und leicht optimiert - https://css-tricks.com/snippets/php/intelligent-php-cache-control/
MitchellK
quelle