Назад | Перейти на главную страницу

Nginx `if_modified_since` работает только со статическими ресурсами?

Я не могу найти достаточно документация. У меня есть приложение, которое генерирует некоторые динамические ответы, но все же может извлечь выгоду из 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.