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

Я читал о заголовке Pragma на Wikipedia, в котором говорится:

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

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

Ответ 1

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

Ответ 2

Нет никакой разницы, кроме того, что 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!

Ответ 3

| 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