HTTP Истекает значения заголовка "0" и "-1"
В чем разница между Expires: 0
и Expires: -1
в заголовке ответа HTTP? RFC 2616 определяет недопустимые форматы дат, особенно, в том числе значение "0", как истекло. Однако некоторые серверы (например, www.google.de) отвечают с помощью Expires: -1
.
Есть ли преимущество перед использованием -1
over 0
или это даже требуется для некоторых сломанных HTTP-клиентов?
Ответы
Ответ 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: я даю за час до этого только в случае.