header mit php - 1.0 oder 1.1 oder sonderschreibweise
kölir
- php
0 Sven Rautenberg0 kölir0 Sven Rautenberg0 kölir
0 manfred1 Sven Rautenberg
Hallihallöle,
was ist zu bevorzugen, wenn ich header sende?
header('HTTP/1.0
oder
header('HTTP/1.1
?
Überschreiben sich diese header, oder sollte ich einfach beide senden?
Und was ist zum beispiel mit der Status-header-sonderschreibweise:
header("Status: 404 Not Found");
Ist sowas zu bevorzugen?
Dank und Gruß
Moin!
was ist zu bevorzugen, wenn ich header sende?
header('HTTP/1.0
oder
header('HTTP/1.1
?
Antworte so, wie der Client gefragt hat. Also mit dem gleichen Protokoll.
Überschreiben sich diese header, oder sollte ich einfach beide senden?
header() überschreibt immer alle gleichartigen Header-Angaben, wenn man nichts dagegen unternimmt. Der von dir hier angeführte Header wird aber außerdem noch einer PHP-internen Sonderbehandlung unterzogen, indem er IMMER an den Anfang aller HTTP-Header gesetzt wird.
Und was ist zum beispiel mit der Status-header-sonderschreibweise:
header("Status: 404 Not Found");Ist sowas zu bevorzugen?
Die Doku sagt, dass diese Form, den Statuscode zu setzen, in PHP 3 als CGI-Modul notwendig war.
Da seit PHP 4.3.0 aber auch parallel zu jedem Header ein Response-Statuscode gesetzt werden kann, dürfte die Notwendigkeit eher gering sein.
Solange sich deine Applikation kompatibel zu sowohl den einschlägigen RFCs, als auch zu existierenden HTTP-Clients verhält, ist jegliche Variation der Vorgehensweise ausschließlich Geschmackssache.
- Sven Rautenberg
Hallo,
also so wie angefragt wird.
Also muss ich vor jedem header noch prüfen ob 1.0 oder 1.1.
Wie tue ich das?
Gruß
Moin!
Also muss ich vor jedem header noch prüfen ob 1.0 oder 1.1.
Wie tue ich das?
$_SERVER angucken.
- Sven Rautenberg
SERVER_PROTOCOL?
Ist das einzige, das ich gerade bei print_r($_SERVER) gefunden habe.
Aber ich möchte ja Client nicht Server ...
Gruß
Moin!
SERVER_PROTOCOL?
Ist das einzige, das ich gerade bei print_r($_SERVER) gefunden habe.
Aber ich möchte ja Client nicht Server ...
Na und? ;) Diese Angabe kommt vom Webserver und wird, genau wie alles andere in $_SERVER, dem Skript als Info zur Verfügung gestellt. Egal ist, wie es genau heißt. Wichtig ist, dass die Info drinsteht.
- Sven Rautenberg
Hallo,
gerade ist mir aufgefallen, eigentlich kann ich ja einfach immer SERVER_PROTOCOL beim header einsetzen.
Doch dann könnte es doch zu headern kommen wie:
HTTPS/1.1 304 Not Modified.
Das ist ja wohl Quatsch?
Gruß
Moin!
Hallo,
gerade ist mir aufgefallen, eigentlich kann ich ja einfach immer SERVER_PROTOCOL beim header einsetzen.
Doch dann könnte es doch zu headern kommen wie:
HTTPS/1.1 304 Not Modified.Das ist ja wohl Quatsch?
Was daran ist Quatsch? HTTPS? Das wird nicht passieren, da es kein Protokoll "HTTPS" gibt, sondern es sich um "HTTP over SSL" handelt: Auf einem per SSL ausgehandelten Kanal wird HTTP gesprochen, und zwar transparent so, dass die beteiligten Endpunkte sich eigentlich nicht drum kümmern müssen.
- Sven Rautenberg
Hallo,
ich klinke mich mal hier ein, da ich auch bisweilen immer header für 1.0 und 1.1 gesendet hatte.
Ich habe mit folgenden headern, das Caching geregelt:
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control:");
header("Pragma: no-cache"); // HTTP/1.0
Jedoch gibt es glaube ich für Cache-Control unterschiede, also müsste ich auch zwischen 1.0 und 1.1 unterscheiden. Wie geht das?
Des weiteren: Gibt es ein Expires-Datum, das besagt "läuft nie ab"?
Wo gibt es eine übersicht, was ich für Cache-Control und Pragma alles setzten kann?
Ich habe irgenetwas gelesen, dass man das neue Abrufen mit einem 304 verhindern kann, wenn schon gecached ist?
Gruß
Moin!
Ich habe mit folgenden headern, das Caching geregelt:
Also eher das Nicht-Caching.
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: Mon, 26 Jul 1997 05:00:00 GMT");header("Cache-Control:");
header("Pragma: no-cache"); // HTTP/1.0Jedoch gibt es glaube ich für Cache-Control unterschiede, also müsste ich auch zwischen 1.0 und 1.1 unterscheiden. Wie geht das?
Da kommt dir die Praxis zugute: Die Clients sind tolerant im Empfang, eine Fallunterscheidung ist nicht notwendig. Die RFC 2068 sagt dazu:
" HTTP/1.1 clients SHOULD NOT send the Pragma request-header. HTTP/1.1
caches SHOULD treat "Pragma: no-cache" as if the client had sent
"Cache-Control: no-cache". No new Pragma directives will be defined
in HTTP."
Und die Bedeutung von "SHOULD" wird erklärt als:
" SHOULD
This word or the adjective "recommended" means that there may
exist valid reasons in particular circumstances to ignore this
item, but the full implications should be understood and the case
carefully weighed before choosing a different course."
Des weiteren: Gibt es ein Expires-Datum, das besagt "läuft nie ab"?
Ja. Einfach keinen Expires-Header senden.
Wo gibt es eine übersicht, was ich für Cache-Control und Pragma alles setzten kann?
Das steht in der HTTP-RFC 2068 aufgezählt drin. http://www.faqs.org/rfcs/rfc2068.html
Ich habe irgenetwas gelesen, dass man das neue Abrufen mit einem 304 verhindern kann, wenn schon gecached ist?
Nein, das Abrufen kannst du nicht verhindern, denn das macht der Client ja gerade, um zu erfahren, ob es eine neuere Seitenversion gibt, oder nicht. Falls ja, lieferst du die normal aus (Status 200). Falls nein, schickst du Status 304 "Not modified".
Damit ein Client aber überhaupt nachfragen kann, benötigt die Seite zwingend mindestens eine Last-modified-Angabe. Ebenfalls gut wäre ein ETag. Erst dann kann der Client die erwünschten "Conditional-Requests" senden, in denen Header drinstehen, die bestimmen, welche Bedingungen vom Server für die Auslieferung beachtet werden müssen.
Für die simpelste Anwendung bei Last-Modified sendet der Client "If-Modified-Since" plus Datum des früher empfangenen Last-Modified.
Wenn du grundsätzlich verhindern willst, dass Clients zwischendurch nachfragen, sende einen Expires-Header mit. Bis zum Ablauf der dort angegebenen Zeit wird der Client dann üblicherweise nicht mehr fragen. Danach dann wieder "conditional".
- Sven Rautenberg
Mittag,
Da kommt dir die Praxis zugute: Die Clients sind tolerant im Empfang, eine Fallunterscheidung ist nicht notwendig. Die RFC 2068 sagt dazu:
" HTTP/1.1 clients SHOULD NOT send the Pragma request-header. HTTP/1.1
caches SHOULD treat "Pragma: no-cache" as if the client had sent
"Cache-Control: no-cache". No new Pragma directives will be defined
in HTTP."Und die Bedeutung von "SHOULD" wird erklärt als:
" SHOULD
This word or the adjective "recommended" means that there may
exist valid reasons in particular circumstances to ignore this
item, but the full implications should be understood and the case
carefully weighed before choosing a different course."
Ja gut, dass bezieht sich auf Pragma, aber es gibt ja auch noch für Cache-Control unterschiede für 1.0 und 1.1.
Des weiteren: Gibt es ein Expires-Datum, das besagt "läuft nie ab"?
Ja. Einfach keinen Expires-Header senden.
Puh jetzt weiß ich nicht, ob PHP einen sendet oder nicht. Weil dann würde ich gerne keinen senden.
Wo gibt es eine übersicht, was ich für Cache-Control und Pragma alles setzten kann?
Das steht in der HTTP-RFC 2068 aufgezählt drin. http://www.faqs.org/rfcs/rfc2068.html
Danke.
Ich habe irgenetwas gelesen, dass man das neue Abrufen mit einem 304 verhindern kann, wenn schon gecached ist?
Nein, das Abrufen kannst du nicht verhindern, denn das macht der Client ja gerade, um zu erfahren, ob es eine neuere Seitenversion gibt, oder nicht. Falls ja, lieferst du die normal aus (Status 200). Falls nein, schickst du Status 304 "Not modified".
Und woher weiß ich, ob sie modified im Vergleich zu der vom Client gecacheden Version ist?
Damit ein Client aber überhaupt nachfragen kann, benötigt die Seite zwingend mindestens eine Last-modified-Angabe. Ebenfalls gut wäre ein ETag. Erst dann kann der Client die erwünschten "Conditional-Requests" senden, in denen Header drinstehen, die bestimmen, welche Bedingungen vom Server für die Auslieferung beachtet werden müssen.
Ok Last-modified weiß ich bei jedem meiner Inhalte.
ETag?
Für die simpelste Anwendung bei Last-Modified sendet der Client "If-Modified-Since" plus Datum des früher empfangenen Last-Modified.
Heißt für mich ich sende last-modified und erhalte vom Client ein last-modified zum Vergleich. Dann schicke ich jenachdem 200 oder 304?
Gruß
Hallo,
P.S.: http://de.php.net/manual/de/function.header.php#85146
Hier wird bei 304 wirklich kein Inhalt mehr ausgegeben und mit exit; abgebrochen.
Wobei ich das vorgehen noch nicht ganz verstehe.
Was genau steht im ETag?
Und $_SERVER['HTTP_IF_MODIFIED_SINCE'] wird mit der wirklich letzen Änderungszeit verglichen, wobei HTTP_IF_MODIFIED_SINCE der Wert ist, den der Client bei einem Aufruf zuvor erhalten hatte?
Gruß
Moin!
P.S.: http://de.php.net/manual/de/function.header.php#85146
Hier wird bei 304 wirklich kein Inhalt mehr ausgegeben und mit exit; abgebrochen.Wobei ich das vorgehen noch nicht ganz verstehe.
Eine Statusantwort 304 darf keinen Inhalt enthalten, sondern besteht nur aus den HTTP-Headern.
Was genau steht im ETag?
Irgendeine von dir konstruierte Zeichenkette, die den Anforderungen an "opaque-tag" genügt.
Die Zeichenfolge sollte geeignet sein, dir eine Identifikation der gesendeten Ressource zu ermöglichen, zumindest aber den Vergleich, ob die beim Client befindliche Ressource identisch mit der mittlerweile auf dem Server gespeicherten ist, oder nicht.
Und $_SERVER['HTTP_IF_MODIFIED_SINCE'] wird mit der wirklich letzen Änderungszeit verglichen, wobei HTTP_IF_MODIFIED_SINCE der Wert ist, den der Client bei einem Aufruf zuvor erhalten hatte?
Du hast im Prinzip alle Freiheiten, beliebige Datumsvergleiche durchzuführen, und auch beliebige Zeiten zu senden - aber für eine Implementierung analog zum üblichen Serververhalten wäre es schlau, sich an diesem Schema zu orientieren: Statische Dateien werden mit dem Änderungsdatum der Datei als "Last-Modified" ausgeliefert, und dieses Datum wird auch zum Vergleich gegen "If-Modified-Since" herangezogen.
- Sven Rautenberg
Hallo,
ich stehe auf dem Schlauch.
Wenn ich merke, dass der Client die neuste Version hat, dann header('304, aber kein Inhalt? Ich mein er braucht doch trotzdem einen Inhalt.
Wie kann ich herausfinden, welche header schon gesendet wurden?
Gruß
Moin!
ich stehe auf dem Schlauch.
Wenn ich merke, dass der Client die neuste Version hat, dann header('304, aber kein Inhalt? Ich mein er braucht doch trotzdem einen Inhalt.
Hier mal etwas ausführlicher, wie das Hin und Her zwischen Client und Server so ablaufen könnte...
00:00 Uhr. Client wird frisch installiert, gestartet, hat nix im Cache, ist geradezu jungfräulich.
00:01 Uhr. Client ruft http://www.example.org/ auf. Der Request ist ein ganz normaler GET-Request ohne irgendwelche Bedingungen: "GET /".
00:02 Uhr. Der Server empfängt den Request. Er ermittelt, dass wohl die "index.html" auf seiner Festplatte gemeint ist, und schickt folgende Information im HTTP-Header mit: 1. Last-modified: "Ein Datum vor drei Monaten" und 2. Expires: in 1 Stunde und 30 Minuten.
00:03 Uhr. Der Client zeigt dem Benutzer die Seite und speichert sie natürlich auch im Cache.
Zeit vergeht...
01:00 Uhr. Der Client soll dem Benutzer wieder diese Startseite anzeigen. Da laut Expires-Header diese Seite noch gültig ist, wird kein Request an den Server geschickt, sondern direkt der Inhalt des Caches verwendet.
Zeit vergeht...
02:00 Uhr. Schon wieder der Aufruf dieser Startseite (und merkwürdigerweise immer im Stundentakt - wer sich das wohl ausgedacht hat). Der Browser hat zwar eine Seite im Cache, aber die ist seit einer halben Stunde als ungültig anzusehen. Da sie aber eine Angabe zu Last-modified hat, kann der Client einen Conditional-Request senden: "GET / If-modified-since 'Ein Datum vor drei Monaten'"
02:01 Uhr. Der Server empfängt den Request. Er ermittelt, dass wohl die "index.html" auf seiner Festplatte gemeint ist - da aber auch die Bedingung übermittelt wurde, prüft er zuerst mal, ob die Startseite seit dem in der Bedingung angegebenen Datum verändert wurde. Das ist nicht der Fall. Also antwortet er nur mit einem HTTP-Header ohne Inhalt, aber mit Status "304 Not modified".
02:02 Uhr. Der Client empfängt den Status 304 (ohne Inhalt). Er weiß damit, dass sein Cache-Inhalt immer noch aktuell ist, und zeigt ihn an. Das spart den Datentransfer des Seiteninhalts.
Wie kann ich herausfinden, welche header schon gesendet wurden?
Das kannst du mit PHP nicht herausfinden - außer du sendest mit PHP einen HTTP-Request an deinen eigenen Server und wertest aus, welche HTTP-Header der so versendet. Dieselbe Möglichkeit hättest du aber auch, wenn du deinen Browser benutzt, um dir die Header anzeigen zu lassen - oder ein anderes HTTP-fähiges Programm, dass diese Aufgabe erledigt.
Wenn du festgestellt hast, welche Header gesendet werden, und dir der Inhalt einiger davon nicht gefällt, wäre die nächste Aufgabe, die Ursache für diesen Header zu ermitteln (nicht alle Header, die mit der Ausgabe eines PHP-Skriptes mitgesendet werden, sind durch das PHP-Skript verursacht, einige werden auch durch entsprechende Konfiguration des Webservers initiiert), um dann deinen Wünschen entsprechend einzugreifen.
- Sven Rautenberg
Moin!
Ja gut, dass bezieht sich auf Pragma, aber es gibt ja auch noch für Cache-Control unterschiede für 1.0 und 1.1.
Keine praxisrelevanten. HTTP/1.0 definiert keinen Header "Cache-control".
Des weiteren: Gibt es ein Expires-Datum, das besagt "läuft nie ab"?
Ja. Einfach keinen Expires-Header senden.
Puh jetzt weiß ich nicht, ob PHP einen sendet oder nicht. Weil dann würde ich gerne keinen senden.
Sowas kann man ja feststellen und im Zweifel konfigurieren.
Nein, das Abrufen kannst du nicht verhindern, denn das macht der Client ja gerade, um zu erfahren, ob es eine neuere Seitenversion gibt, oder nicht. Falls ja, lieferst du die normal aus (Status 200). Falls nein, schickst du Status 304 "Not modified".
Und woher weiß ich, ob sie modified im Vergleich zu der vom Client gecacheden Version ist?
Indem du irgendeinen Aktualitätsvergleich programmierst.
Heißt für mich ich sende last-modified und erhalte vom Client ein last-modified zum Vergleich. Dann schicke ich jenachdem 200 oder 304?
- Sven Rautenberg
Hi,
Nein, das Abrufen kannst du nicht verhindern, denn das macht der Client ja gerade, um zu erfahren, ob es eine neuere Seitenversion gibt, oder nicht. Falls ja, lieferst du die normal aus (Status 200). Falls nein, schickst du Status 304 "Not modified".
Damit ein Client aber überhaupt nachfragen kann, benötigt die Seite zwingend mindestens eine Last-modified-Angabe.
Nein, das ist m.E. nicht zwingend nötig.
Wenn der Header Last-Modified fehlt, könnte der Client genausogut den ursprünglichen Abrufzeitpunkt verwenden für die Nachfrage.
cu,
Andreas