Разница между заголовками Pragma и Cache-Control?


166

Я прочитал о заголовке Pragma в Википедии, где написано:

«Поле заголовка Pragma: no-cache - это заголовок HTTP / 1.0, предназначенный для использования в запросах. Он позволяет браузеру сообщать серверу и любым промежуточным кешам, что ему нужна свежая версия ресурса, а не сервера. сказать браузеру не кэшировать ресурс. Некоторые пользовательские агенты обращают внимание на этот заголовок в ответах, но RFC HTTP / 1.1 специально предупреждает против использования такого поведения ».

Но я не понял, что он делает? В чем разница между Cache-Controlзаголовком, значение которого no-cacheи Pragmaзначение которого также no-cache?

Ответы:


196

Pragmaявляется реализацией HTTP / 1.0 и cache-controlявляется реализацией HTTP / 1.1 той же концепции. Они оба предназначены для предотвращения кэширования ответа клиентом. Старые клиенты могут не поддерживать HTTP / 1.1, поэтому этот заголовок все еще используется.


31
Хотя ответ cnst ниже намного сложнее, он также намного более корректен в соответствии со спецификацией. Pragma: no-cacheпредназначен для использования только в запросах (что означает «я хочу оригинал, а не кэшированную копию»), и его поведение не указано для ответов.
Клим

5
Cache-Control: no-cacheимеет то же значение для запросов, но на самом деле также определено для ответов, что означает «Если вы хотите использовать кэшированную копию этого в будущем, вы должны сначала проверить со мной, что она актуальна (т.е. выполнить повторную проверку)».
Клим

3
Он предназначен для управления кэшем, он не должен быть ТОЛЬКО для предотвращения кэширования, его также можно использовать, чтобы сказать «Вы можете кэшировать это». ....
jave.web

Основной ответ. Чтобы сделать это более сложным: это также заголовок запроса, который означает, что вы также можете отправлять no-cache на сервер. И это на самом деле может означать возвращение устаревшего контента клиентам, ЧТО? Теперь вы забыли это и прочитали простой ответ, приведенный выше, и наслаждайтесь жизнью, не копайте ее слишком усердно.
Lol

Они оба предназначены для того, чтобы предотвратить кэширование клиентом ответа . Он также может иметь, max-ageчто не мешает кешированию. Он просто устанавливает срок годности для него ...
Мед

97

Разницы нет, за исключением того, что Pragmaона определяется только как применимая к запросам клиента, тогда как Cache-Controlможет использоваться как запросами клиентов, так и ответами серверов.

Таким образом, что касается стандартов, их можно сравнивать только с точки зрения клиента, выполняющего запросы, и сервера, получающего запрос от клиента. Http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 определяет сценарий следующим образом :

Кэши HTTP / 1.1 ДОЛЖНЫ трактовать «Pragma: no-cache», как если бы клиент отправил «Cache-Control: no-cache». Никакие новые директивы Pragma не будут определены в HTTP.

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

Способ, которым я прочитал бы выше:

  • если вы пишете клиент и нуждаетесь в no-cache:

    • просто используйте Pragma: no-cacheв своих запросах, так как вы можете не знать, Cache-Controlподдерживается ли сервер;
    • но в ответах, чтобы решить, следует ли кэшировать, проверьте Cache-Control
  • если вы пишете сервер:

    • при разборе запросов от клиентов проверьте Cache-Control; если не найден, проверьте Pragma: no-cacheи выполните Cache-Control: no-cacheлогику;
    • в ответах предоставим Cache-Control.

Конечно, реальность может отличаться от того, что написано или подразумевается в RFC!


5
Что, если в заголовке есть оба? Cache-Control: max-age=86400а Pragma: no-cache? Какой из них тогда будет удостоен чести современных браузеров?
PKHunter

3
@PKHunter, почему тебя волнует, как это происходит, если поведение не определено? Если вы отвечаете за сервер, очевидно, что вы можете добиться большего успеха, чем выдавать ложную информацию клиенту. Кроме того, как указано в моем ответе, Pragma: no-cacheоно определено только для запросов от браузера, и, таким образом, оно будет полностью недействительным и неопределенным в ответах от сервера к браузеру, например, я думаю, что каждый браузер (будь то современный или не) следует игнорировать такой заголовок в любом ответе, который он может получить.
17

3
Современный браузер должен игнорировать Pragma в пользу Cache-Control, если оба присутствуют, поскольку последний может указывать периоды времени и другую информацию, которая не была доступна в исходном протоколе 1.0.
Рэндалл Борк

17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

Если это после 1999 года, и вы все еще используете Expires или Pragma , вы делаете это неправильно.

Я смотрю на тебя Stackoverflow:

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr: Pragmaявляется наследием HTTP / 1.0 и не требуется с Internet Explorer 5 или Netscape 4.7. Если вы не ожидаете, что некоторые из ваших пользователей будут использовать IE5: безопасно прекратить его использование.


  • Истекает: [date] (устарело - HTTP 1.0)
  • Pragma: no-cache (устарело - HTTP 1.0)
  • Cache-Control: max-age =[seconds]
  • Cache-Control: no-cache (необходимо каждый раз повторно проверять кэшированную копию)

И условные запросы:

  • Условные запросы на основе тегов Etag (entity tag)
    • Сервер: Etag: W/“1d2e7–1648e509289”
    • Клиент: If-None-Match: W/“1d2e7–1648e509289”
    • Сервер: 304 Not Modified
  • Измененные условные запросы на основе даты
    • Сервер: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Клиент: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Сервер: 304 Not Modified

Последнее изменение: четверг, 09 мая 2019 г., 19:15:47 GMT


2
В RFC говорится, что вы должны использовать их оба в случае, если клиент не поддерживает Cache-Control: tools.ietf.org/html/rfc7234#page-29
Рэндалл Борк,

3
Клиент «должен» включать в себя как - если он не хочет , чтобы обработать HTTP - сервера / 1.1 и HTTP / 1.0 кэширования по- разному. Сервер не должен включать Pragmaвообще. (В HTTP / 1.0 Pragma была определена как расширяемое поле для заданных реализацией директив для получателей. В этой спецификации не рекомендуется использовать такие расширения для улучшения взаимодействия.)
Ян Бойд,

2
С точки зрения безопасности, рекомендуется использовать его. Многие браузеры следуют директиве pragma: no-cache, поэтому рекомендуется использовать ее с помощью OWASP: owasp.org/index.php/…
Randall Borck

2
@RandallBorck: Вы распространяете устаревшую (не менее двух десятилетий!) Информацию. Никакие браузеры больше не следуют директиве Pragma, кроме 1999 года. Это совет культового груза: «это не больно, и мы всегда это делали, поэтому это хорошо и необходимо».
Писквор покинул здание

2
@Piskvor Большинство серверов по-прежнему поддерживают версии 1.0 и 1.1, поэтому, если вы активно не блокируете запросы HTTP / 1.0, вы не выбираете, какой протокол использует клиент. Большинство разработчиков сегодня не заботятся о блокировке 1.0, поэтому это все еще лучшая практика, даже в 2019 году.
Рэндал Борк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.