2012-07-06 3 views
42

Was ist der Unterschied zwischen Expires: 0 und Expires: -1 im HTTP-Antwortheader? RFC 2616 definiert ungültige Datumsformate, insbesondere einschließlich des Werts "0" als bereits abgelaufen. Einige Server (z. B. www.google.de) antworten jedoch mit Expires: -1.HTTP Läuft Header-Werte "0" und "-1" ab

Gibt es einen Vorteil gegenüber der Verwendung -1 über 0 oder ist dies sogar für einige defekte HTTP-Clients erforderlich?

+4

Es definiert nicht "0" 'als" bereits abgelaufen "- es definiert" ungültige Datumsformate ", * einschließlich *' "0" ', als" bereits abgelaufen " –

+0

Das ist richtig, danke für diesen Hinweis. Aber es scheint mir, dass "0" vorzuziehen sein sollte, wenn ein "ungültiges Datumsformat" angegeben wird. – scai

+2

Nein, die Präferenz (im nächsten Absatz ausgedrückt) besteht darin, ein gültiges Datumsformat zu verwenden, das den gleichen Wert wie den Header "Date" enthält, um anzuzeigen, dass es bereits abgelaufen ist. –

Antwort

29

Das Problem ist in wie ungültige Expires-Header von Internet Explorer (vor allem ältere Versionen) verarbeitet. IE verwendet Trident Layout-Engine und WinINET API, um HTTP-Anforderungen zu verarbeiten. Wie Sie vielleicht wissen

<meta http-equiv="Expires" content="0"> 

Im zweiten Fall

Expires: 0 

oder in Meta-Tag in HTTP-Header

angegeben werden Gültig bis könnte, Verfällt wurde ein Teil der Antwortinhalt (Inhalt nicht Header), so wird es sein processed by Trident and then propagated to WinINET:

Wenn WinINET eine Antwort mit einem ungültigen Downloads Expires-Header (zB eine, die keinen gültigen HTTPDATE Wert enthält) und kein anderes Caching wird es das Dokument als abgelaufen vor einer Stunde markieren. Trident hat jedoch keine solche Logik. Wenn Sie eine ungültige Zeit angeben, greift Trident den aktuellen Zeitstempel und verwendet diesen als Ablaufdatum. Trident verwendet auch den aktuellen Zeitstempel, wenn er die Pragma: No-Cache-Direktive findet. Wenn der Benutzer versucht, während der gleichen Sekunde, in der HTTP/404 verarbeitet wurde, erneut zum aktuellen Dokument zu navigieren, führt der falsch aktualisierte Ablauf des vorhandenen Cache-Eintrags dazu, dass er für diese Anforderung als neu behandelt wird. Wenn der Benutzer die Refresh-Schaltfläche oder F5 drückt, wird der Cache umgangen und die 404-Seite angezeigt.

Mit anderen Worten Expires: 0 nicht immer führen zum sofortigen Ressource Ablauf, sollte daher vermieden werden und Expires: [some valid date in the past] sollte stattdessen verwendet werden.

+1

Das ist die "einige kaputte HTTP-Client" Antwort, auf die ich gewartet habe und erklärt den Grund für "Expires: -1", danke! :) – scai

+9

3 upvotes? Hat jemand die Antwort gelesen? Laut dem Artikel gibt es * keinen Unterschied * zwischen 'Expires: -1' und' Expires: 0'. – user123444555621

+4

Das ist richtig. Der Artikel erläutert nur eine falsch behandelte * Expires = 0 * im HTML-Meta-Element. Kein einziges Wort über * Expires = -1 * oder andere falsch behandelte Expires-Werte im HTTP-Header. – scai

8

Läuft ab: -1 Die Expires-Kopfzeile gibt an, wann der Inhalt als veraltet angesehen werden soll. Der Wert -1 zeigt an, dass der Inhalt sofort abläuft und erneut angefordert werden muss, bevor er erneut angezeigt wird. http://www.httpwatch.com/httpgallery/headers/

max-age = 0 einfach sagt Caches (und User Agents) die Antwort abgestanden ist aus der get-go und so sollten sie die Antwort (z. B. mit der If-Not-Modified-Header) revalidate bevor eine Verwendung cache-Kopie, während no-cache ihnen sagt, dass sie erneut validieren müssen, bevor sie eine zwischengespeicherte Kopie verwenden.

für weitere Informationen schauen Sie in http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf

+2

Danke, aber meine Frage war speziell über den Unterschied zwischen 'Expires: 0' und' Expires: -1'. – scai

+0

+1 Obwohl nicht wirklich eine Antwort auf die Frage, aber es ist relevant für das Thema. Scheint mir, wenn Sie versuchen, abläuft: -1 oder 0 Sie werden wahrscheinlich auch die maximale Alter = 0 verwenden. Wahrscheinlich hätte es eher ein Kommentar als eine Antwort sein sollen. –

1

Verwendung von „-1“ ist ungültig, und würde das gleiche wie „0“ behandelt werden. Es sollte überhaupt kein Nachladen auslösen.

Seien Sie vorsichtig: In manchen Browsern kann es eine Stunde mehr geben oder die Standardlaufzeit für das Einlösen verwenden.

1- Also besser ein richtiges altes Datum zu geben wie:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 

Für formale Arbeit, ich Beratung die aktuelle Datum Zeit meta geben Verfällt statt Alt Fixtermin mit (das macht Suchmaschinen wie google Ihre Website als alt markieren und nicht auf Topper angezeigt)

2-, wenn Ihr Backend ist PHP Sie damit umgehen können wie:

<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" /> 

PS: Ich gebe eine Stunde vorher nur für den Fall.