
Я не могу найтидостаточнодокументация. У меня есть приложение, которое генерирует некоторые динамические ответы, но заголовок все равно может быть полезен 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
это реализовано, по сравнению с тем, где я устанавливаю свои ожидания. Я предполагал, что он просто будет смотреть на заголовки ответа и переопределять статус по мере необходимости. Я не прав?
решение1
Отправка Last-Modified
заголовков в ответах вашего приложения — это начало, но, похоже, вы не обрабатываете If-Modified-Since
должным образом входящие запросы, потому что ваше приложение должно отвечать, 304 Not Modified
а не 200 OK
. Изменение директивы в nginx влияет только на запросы, обслуживаемые непосредственно nginx, т. е. статические ресурсы, если вы не настроите его как кэш обратного прокси-сервера. В этом случае вы можете обслуживать устаревшие ответы относительно этого значения заголовка, поскольку содержимое будет кэшироваться в течение определенного периода времени без обращения к вашему приложению. Включение <X>_cache_revalidate
будет использовать If-Modified-Since
заголовок для повторной проверки содержимого кэша между кэшем nginx и вашим приложением после истечения срока его действия (где <X>
= proxy / fastcgi / scgi / uwsgi)
решение2
Поскольку вы ничего не упомянули о конфигурации кэша в Nginx, я предполагаю, что вы не настроили кэш, и это объясняет, почему ваш If-Modified-Since
заголовок не влияет на динамические ответы.
Когда дело доходит до статических ресурсов, у Nginx есть действительно простой способ определить, как обращаться If-Modified-Since
: он сравнивает время в поле со временем последнего изменения файла. Здесь нет проблем.
Если вы хотите, чтобы Nginx делал то же самое с динамически сгенерированными ответами, то сравнивать не с чем,если вы не включите кэширование.По умолчанию Nginx не запоминает ответы, которые он обслуживал. Когда вы включаете кэширование, Nginx имеет способ сравнить входящий запрос с ранее данным ответом, и, таким образом, имеет способ использовать If-Modified-Since
.
Я нашелЭта статьядействительно полезно изучить тонкие детали настройки кэша Nginx.