благодарю!<br><br><div class="gmail_quote">16 октября 2009 г. 9:56 пользователь Noon es Shadow <span dir="ltr">&lt;<a href="mailto:noonesshadow@gmail.com">noonesshadow@gmail.com</a>&gt;</span> написал:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Спасибо за статью!!!<br><br><div class="gmail_quote">16 октября 2009 г. 8:29 пользователь Igor Sysoev <span dir="ltr">&lt;<a href="mailto:is@rambler-co.ru" target="_blank">is@rambler-co.ru</a>&gt;</span> написал:<div><div>
</div><div class="h5"><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>On Fri, Oct 16, 2009 at 03:41:23AM +0400, Dmitry Koterov wrote:<br>
<br>
&gt; Я тут статью черканул: <a href="http://dklab.ru/chicken/nablas/56.html" target="_blank">http://dklab.ru/chicken/nablas/56.html</a><br>
&gt; Если есть мысли/замечания/комментарии/уточнения, буду рад внести изменения.<br>
<br>
</div><div>&gt; fastcgi_cache_valid: кэшируем код ответа 304 тоже<br>
&gt;<br>
&gt; fastcgi_cache_valid 200 301 302 304 5m;<br>
&gt;<br>
</div>&gt; В директиве fastcgi_cache_valid&lt;<a href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_valid" target="_blank">http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_valid</a>&gt;мы<br>


<div>&gt; заставляем кэшировать не только стандартные коды 200 ОК, 301 Moved<br>
&gt; Permanently и 302 Found, но также и 304 Not Modified. Почему? Давайте<br>
&gt; вспомним, что означает 304. Он выдается с пустым телом ответа в двух<br>
&gt; случаях:<br>
&gt;<br>
&gt;    - Если браузер послал заголовок &quot;If-Modified-Since: date&quot;, в котором date<br>
&gt;    больше либо равна значению заголовка ответа &quot;Last-Modified: date&quot;. Т.е.<br>
&gt;    клиент спрашивает: &quot;Есть ли новая версия с момента date? Если нет, верни мне<br>
&gt;    304 и сэкономь трафик. Если есть, отдай мне тело страницы&quot;.<br>
&gt;    - Если браузер послал заголовок &quot;If-None-Match: hash&quot;, где hash совапдает<br>
&gt;    со значением заголовка ответа &quot;ETag: hash&quot;. Т.е. клиент спрашивает:<br>
&gt;    &quot;Отличается ли текущая версия страницы от той, что я запросил в прошлый раз?<br>
&gt;    Если нет, верни мне 304 и сэкономь трафик. Если да, отдай тело страницы&quot;.<br>
&gt;<br>
&gt; В обоих случаях Last-Modified или ETag будут взяты, скорее всего, из кэша<br>
&gt; nginx, и проверка пройдет очень быстро. Нам незачем &quot;дергать&quot; PHP только для<br>
&gt; того, чтобы скрипт выдал эти заголовки, особенно в свете того, что клиентам,<br>
&gt; которым уйдет ответ 200, он будет отдан из кэша. fastcgi_cache_key:<br>
&gt; внимательно работаем с зависимостями<br>
&gt;<br>
&gt; fastcgi_cache_key<br>
&gt; &quot;$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri&quot;;<br>
&gt;<br>
&gt; Особого внимания заслуживает значение в директиве<br>
</div>&gt; fastcgi_cache_key&lt;<a href="http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_key" target="_blank">http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache_key</a>&gt;.<br>


<div>&gt; Я привел минимальное рабочее значение этой директивы. Шаг вправо, шаг влево,<br>
&gt; и вы начнете в ряде случаев получать &quot;неправильные&quot; данные из кэша. Итак:<br>
&gt;<br>
&gt;    - Зависимость от $request_method нам нужна, т.к. HEAD-запросы в Интернете<br>
&gt;    довольно часты. Ответ на HEAD-запрос никогда не содержит тела. Если убрать<br>
&gt;    зависимость от $request_method, то может так совпасть, что кто-то до вас<br>
&gt;    запросил главную страницу HEAD-методом, а вам потом по GET отдастся пустой<br>
&gt;    контент.<br>
&gt;    - Зависимость от $http_if_modified_since нужна для того, чтобы кэш с<br>
&gt;    ответом 304 Not Modified не был случайно отдан клиенту, делающему обычный<br>
&gt;    GET-запрос. Иначе клиент может получить пустой ответ из кэша.<br>
&gt;    - То же самое и с $http_if_none_match. Мы должны быть застрахованы от<br>
&gt;    выдачи пустых страниц клиентам!<br>
&gt;    - Наконец, зависимость от $host и $request_uri не требует комментариев.<br>
<br>
</div>Спасибо. Комментарий по поводу 304 и HEAD:<br>
<br>
1) HEAD должен отрабатываться нормально без дополнительных настроек:<br>
   fastcgi_cache_key  &quot;...$request_method...&quot;, то есть, у бэкенда всё равно<br>
   запрашивается GET, полный ответ кэшируется и отдаётся только заголовок.<br>
<br>
2) 304, $http_if_modified_since, $http_if_none_match, etc.:<br>
   Строки If-Modified-Since, If-Range, Range, etc. вырезаются из запроса<br>
   к бэкенду, поэтому всегда кэшируется полный ответ. Клиенту же<br>
   возвращется то, что он попросил.<br>
<font color="#888888"><br>
<br>
--<br>
Игорь Сысоев<br>
<a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
<br>
</font></blockquote></div></div></div><br>
</blockquote></div><br>