Я не могу найти достаточно документация. У меня есть приложение, которое генерирует некоторые динамические ответы, но все же может извлечь выгоду из Last-Modified
заголовок - так что отправляю.
Однако при включении if_modified_since
(установлен в before
, на http://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since), похоже, не влияет на нестатические ресурсы. Например, приложения php, python.
Это потому, что Nginx не просто смотрит на мой ответ? Last-Modified
заголовок? Потому что я вижу, что они настроены правильно, как показано ниже:
> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT
Или я не замечаю чего-то большего? Просто любопытно, как if_modified_since
реализовано, по сравнению с тем, что я ожидал. Я предполагал, что он будет просто смотреть на заголовки ответов и при необходимости отменять статус. Я ошибся?
Отправка Last-Modified
заголовки в ответах вашего приложения - это начало, но, похоже, вы не справляетесь If-Modified-Since
правильно для входящих запросов, потому что ваше приложение должно отвечать 304 Not Modified
и нет 200 OK
. Изменение директивы в nginx влияет только на запросы, обслуживаемые непосредственно nginx, то есть статические ресурсы, если вы не настроите его как кеш обратного прокси. В этом случае вы можете отправлять устаревшие ответы относительно этого значения заголовка, поскольку контент будет кэшироваться в течение определенного периода времени, не затрагивая ваше приложение. Превращение <X>_cache_revalidate
будет использовать If-Modified-Since
заголовок для повторной проверки содержимого кеша между кешем nginx и вашим приложением по истечении срока его действия (где <X>
= прокси / fastcgi / scgi / uwsgi)
Поскольку вы ничего не упомянули о конфигурации своего кеша в Nginx, я предполагаю, что вы не установили кеш, и это объясняет, почему ваш If-Modified-Since
заголовок не влияет на динамические ответы.
Когда дело доходит до статических ресурсов, у Nginx есть действительно простой способ определить, как обрабатывать If-Modified-Since
: сравнивает время в поле со временем последнего изменения файла. Нет проблем.
Если вы хотите, чтобы Nginx делал то же самое с динамически генерируемыми ответами, ему не с чем сравнивать, если вы не включите кеширование. По умолчанию Nginx не запоминает отправленные им ответы. Когда вы включаете кеширование, Nginx может сравнивать входящий запрос с ранее полученным ответом и, таким образом, может использовать If-Modified-Since
.
я обнаружил Эта статья действительно полезно изучить более тонкие детали настройки кеша Nginx.