Co oznacza nagłówek HTTP If-None - Match:*?

Co oznacza poniższy nagłówek HTTP 1.1?

If-None - Match: *

Rozumiem to, gdy używasz mocnego lub słabego Etagu lub nawet listy Etagów, ale nie zaniżam jego użycia, gdy używasz Gwiazdy (*).

Edit: byłoby miło mieć jakiś pseudokod (kod PHP również dobry), który pokaże jak / co odpowiedzieć na "If-None-Match:*".

Author: Chris Huang-Leaver, 2010-01-21

2 answers

Odpowiedź brzmi: to zależy.

Załóżmy, że otrzymaliśmy

If-None-Match: *
If-Modified-Since: <yesterday date>

I strona została zmieniona dzisiaj .

Najpierw przyjrzymy się *, która mówi nam: "Return 304 if the resource is there and condition (2) is specified". Dobrze, zasób istnieje, ale warunek (2) stwierdza: "zwraca tylko 304, jeśli data jest późniejsza niż bieżąca". Więc ten warunek nie jest spełniony, a strona zostanie dostarczona w całości.

Gdybyśmy nie otrzymali If-Modified-Since, odpowiedź 304.

Gdyby zasób nie istniał na żądanie, zwrócilibyśmy odpowiedni kod(tak jakby nie było If-None-Match).

304 powinno być zwracane tylko w odpowiedzi na żądania GET I HEAD, a wszystkie nagłówki odpowiedzi związane z pamięcią podręczną muszą tam być. Dla wszystkich innych typów zapytań Twój serwer musi odpowiadać na 412 (Warunek wstępny nie powiódł się).

Mam nadzieję, że to pomoże;)

 39
Author: St.Woland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 19:57:09

Cytowanie z RFC 2616 (HTTP 1.1):

... jeśli podano " * " i istnieje jakakolwiek aktualna encja dla tego zasobu, to serwer nie może wykonać żądanej metody, chyba że jest to wymagane, ponieważ Data modyfikacji zasobu nie jest zgodna z datą podaną w polu nagłówka If-Modified-Since w żądaniu.

RFC mówi dalej, że zamiast wykonywać żądanie, serwery powinny odpowiedzieć 304 (bez modyfikacji) dla żądań GET I HEAD, i że powinni odpowiedzieć 412 (Warunek wstępny nie powiódł się) dla wszystkich innych typów wniosków. Ale to tylko wtedy, gdy serwer rzeczywiście ma jakąś wersję żądanego zasobu. Jeśli nie masz żadnych encji, to powinieneś obsłużyć żądanie(prawdopodobnie z 404, ponieważ nic nie masz).

Aby obsłużyć żądanie, najpierw dowiedz się, co serwer zrobiłby, gdyby nagłówek nie był obecny. Jeśli wynikiem tego żądania będzie a nie 2xx lub 304, to serve żądanie jak zwykle. Ale jeśli wynikiem żądania będzie 2xx lub 304, to obsłuż sprawę If-None-Modified. Gdy jest to gwiazda, po prostu zwróć natychmiast 304 (chyba, że to If-Modified-Since). Jeśli jest to jeden lub więcej znaczników encji, sprawdź, czy któryś z tych znaczników pasuje do znacznika rzeczy, którą planujesz służyć jako odpowiedź. Jeśli jest jakiś mecz, zwróć 304; jeśli nie ma meczu, podaj go tak, jak zwykle.

Później w RFC jest więcej:

Znaczenie "If-None-Match: *" jest takie, że metoda nie może być wykonywana, jeśli reprezentacja wybrana przez serwer źródłowy( lub przez cache, ewentualnie przy użyciu mechanizmu różnicowego, patrz sekcja 14.44) Istnieje i powinna być wykonywana, jeśli reprezentacja nie istnieje. Funkcja ta ma być przydatna w zapobieganiu wyścigom między operacjami PUT.

Oznacza to, że gwiazda pozwala klientowi powiedzieć: "nie umieszczaj tego pliku, jeśli istnieje jakikolwiek wersja tego pliku już tam jest."

 11
Author: Rob Kennedy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-21 21:03:07