Вопрос: 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 по сравнению с тем, где я устанавливаю свои ожидания. Я предположил, что он просто посмотрит на заголовки ответов и переведет статус по мере необходимости. Я ошибаюсь?


6
2018-05-01 20:20


Источник


По умолчанию nginx рассматривает запрос с аргументами cachable? Я знаю, что это различие в различных продуктах кеширования, но я недостаточно осведомлен о том, чтобы nginx знал об этом. - Cameron Kerr


Ответы:


Отправка Last-Modified заголовки в ваших ответах на приложения - это начало, но кажется, что вы не обрабатываете If-Modified-Since правильно на входящие запросы, потому что ваше приложение должно ответить 304 Not Modified и не 200 OK, Изменение директивы на nginx только на запросы воздействия, которые подаются непосредственно nginx, то есть static ressources, если вы не настроите его как обратный прокси-кеш. В этом случае вы можете подавать устаревшие ответы относительно этого значения заголовка, так как контент будет кэшироваться в течение определенного периода времени, не нажимая на ваше приложение. Превращение <X>_cache_revalidate будет использовать If-Modified-Since заголовок для повторной проверки содержимого кеша между кешем nginx и вашим приложением, если он истек (где <X> = прокси / fastcgi / scgi / uwsgi)


4
2018-05-02 06:04



Благодарю. Эта строка очищает мой основной вопрос: Changing the directive on nginx only impact requests served directly by nginx i.e. static ressources unless you configure it as a reverse proxy cache, - например, Nginx не действовать на нестатический контент без дополнительной настройки. БЛАГОДАРЯ! - anonymous coward


Поскольку вы ничего не упомянули о настройке кеша в Nginx, я собираюсь предположить, что вы не установили кеш, и это объясняет, почему ваш If-Modified-Since заголовок не влияет на динамические ответы.

Когда речь идет о статических ресурсах, Nginx имеет очень простой способ определить, как обращаться If-Modified-Since: он сравнивает время в поле со временем последнего изменения файла. Нет проблем.

Когда вы хотите, чтобы Nginx делал то же самое с динамически генерируемыми ответами, нет ничего, чтобы сравнить его, если вы не включите кеширование. По умолчанию Nginx не помнит ответы, которые он обслуживал. Когда вы включаете кеширование, Nginx имеет способ сравнить входящий запрос с ранее предоставленным ответом и, следовательно, имеет способ использовать If-Modified-Since,

Я нашел Эта статья действительно полезно узнать более тонкие детали установки кеша Nginx.


0
2018-05-01 23:58