Подтвердить что ты не робот

HTTP Истекает значения заголовка "0" и "-1"

В чем разница между Expires: 0 и Expires: -1 в заголовке ответа HTTP? RFC 2616 определяет недопустимые форматы дат, особенно, в том числе значение "0", как истекло. Однако некоторые серверы (например, www.google.de) отвечают с помощью Expires: -1.

Есть ли преимущество перед использованием -1 over 0 или это даже требуется для некоторых сломанных HTTP-клиентов?

4b9b3361

Ответ 1

Проблема заключается в том, как недопустимый заголовок Expires обрабатывается Internet Explorer (особенно более старые версии). IE использует Trident механизм компоновки и WinINET API для обработки HTTP-запросов. Как вы знаете, Expires может быть указано в заголовке HTTP

Expires: 0

или в метатеге

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

Во втором случае Expires стал частью содержимого ответа (а не содержимого заголовка), поэтому он будет обработан Trident и затем распространен в WinINET:

Если WinINET загружает ответ с недопустимым заголовком Expires (например, тот, который не содержит действительного значения HTTPDATE) и никакого другого кэширования директивы, это будет означать, что документ истекает час назад. Однако Trident не имеет такой логики. Если вы укажете недействительное время, Trident захватывает текущую временную метку и использует ее как истечение срока действия. Trident также будет использовать текущую временную метку, если она встретит Директива Pragma: no-cache. Если пользователь пытается повторно перейти к текущий документ в то же время, что HTTP/404 был обработано, неправильно обновленное окончание существующего кеша запись приведет к тому, что он будет считаться свежим для этого запроса. Если пользователь нажал кнопку "Обновить" или F5, кеш будет обходить и страница 404 будет показана.

Другими словами Expires: 0 не всегда приводит к немедленному истечению ресурса, поэтому его следует избегать, и вместо этого следует использовать Expires: [some valid date in the past].

Ответ 2

Истекает: -1 Заголовок Expires указывает, когда содержимое должно считаться устаревшим. Значение -1 указывает, что контент истекает немедленно, и его нужно будет повторно запросить, прежде чем снова отображать его. http://www.httpwatch.com/httpgallery/headers/

max-age = 0 просто сообщает кэшам (и пользовательским агентам), что ответ устарел от get-go, и поэтому они ДОЛЖНЫ повторить проверку ответа (например, с заголовком If-Not-Modified) перед использованием кешированной копии, в то время как no-cache сообщает им, что они ДОЛЖНЫ повторить проверку перед использованием кешированной копии.

для более подробной информации смотрите http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf

Ответ 3

Использование "-1" недействительно и будет обрабатываться так же, как "0". Он не должен запускать перезагрузку вообще.

Будьте осторожны: в некоторых браузерах он может дать 1 час дополнительно или использовать время истечения по умолчанию для обналичивания.

1- Так лучше дать ему правильную старую дату, например:

<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" />

Для формальной работы я советую дать текущее время до meta Expires вместо использования старой фиксированной даты (что заставит поисковые системы, такие как Google, пометить ваш сайт как старый и не отображаться на верхних страницах)

2- Если ваш Backend является PHP, вы можете справиться с ним, как:

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

PS: я даю за час до этого только в случае.