СпаÑибо за Ñтатью!!!<br><br><div class="gmail_quote">16 октÑÐ±Ñ€Ñ 2009 г. 8:29 пользователь Igor Sysoev <span dir="ltr"><<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>></span> напиÑал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Fri, Oct 16, 2009 at 03:41:23AM +0400, Dmitry Koterov wrote:<br>
<br>
> Я тут Ñтатью черканул: <a href="http://dklab.ru/chicken/nablas/56.html" target="_blank">http://dklab.ru/chicken/nablas/56.html</a><br>
> ЕÑли еÑть мыÑли/замечаниÑ/комментарии/уточнениÑ, буду рад внеÑти изменениÑ.<br>
<br>
</div><div class="im">> fastcgi_cache_valid: кÑшируем код ответа 304 тоже<br>
><br>
> fastcgi_cache_valid 200 301 302 304 5m;<br>
><br>
</div>> В директиве fastcgi_cache_valid<<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>>мы<br>
<div class="im">> заÑтавлÑем кÑшировать не только Ñтандартные коды 200 ОК, 301 Moved<br>
> Permanently и 302 Found, но также и 304 Not Modified. Почему? Давайте<br>
> вÑпомним, что означает 304. Он выдаетÑÑ Ñ Ð¿ÑƒÑтым телом ответа в двух<br>
> ÑлучаÑÑ…:<br>
><br>
>   - ЕÑли браузер поÑлал заголовок "If-Modified-Since: date", в котором date<br>
>   больше либо равна значению заголовка ответа "Last-Modified: date". Т.е.<br>
>   клиент Ñпрашивает: "ЕÑть ли Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° date? ЕÑли нет, верни мне<br>
>   304 и ÑÑкономь трафик. ЕÑли еÑть, отдай мне тело Ñтраницы".<br>
>   - ЕÑли браузер поÑлал заголовок "If-None-Match: hash", где hash Ñовапдает<br>
>   Ñо значением заголовка ответа "ETag: hash". Т.е. клиент Ñпрашивает:<br>
>   "ОтличаетÑÑ Ð»Ð¸ Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтраницы от той, что Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñил в прошлый раз?<br>
>   ЕÑли нет, верни мне 304 и ÑÑкономь трафик. ЕÑли да, отдай тело Ñтраницы".<br>
><br>
> Ð’ обоих ÑлучаÑÑ… Last-Modified или ETag будут взÑты, Ñкорее вÑего, из кÑша<br>
> nginx, и проверка пройдет очень быÑтро. Ðам незачем "дергать" PHP только длÑ<br>
> того, чтобы Ñкрипт выдал Ñти заголовки, оÑобенно в Ñвете того, что клиентам,<br>
> которым уйдет ответ 200, он будет отдан из кÑша. fastcgi_cache_key:<br>
> внимательно работаем Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑ‚Ñми<br>
><br>
> fastcgi_cache_key<br>
> "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";<br>
><br>
> ОÑобого Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð·Ð°Ñлуживает значение в директиве<br>
</div>> fastcgi_cache_key<<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>>.<br>
<div class="im">> Я привел минимальное рабочее значение Ñтой директивы. Шаг вправо, шаг влево,<br>
> и вы начнете в Ñ€Ñде Ñлучаев получать "неправильные" данные из кÑша. Итак:<br>
><br>
>   - ЗавиÑимоÑть от $request_method нам нужна, Ñ‚.к. HEAD-запроÑÑ‹ в Интернете<br>
>   довольно чаÑты. Ответ на HEAD-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не Ñодержит тела. ЕÑли убрать<br>
>   завиÑимоÑть от $request_method, то может так ÑовпаÑть, что кто-то до ваÑ<br>
>   запроÑил главную Ñтраницу HEAD-методом, а вам потом по GET отдаÑÑ‚ÑÑ Ð¿ÑƒÑтой<br>
>   контент.<br>
>   - ЗавиÑимоÑть от $http_if_modified_since нужна Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы кÑш Ñ<br>
>   ответом 304 Not Modified не был Ñлучайно отдан клиенту, делающему обычный<br>
>   GET-запроÑ. Иначе клиент может получить пуÑтой ответ из кÑша.<br>
>   - То же Ñамое и Ñ $http_if_none_match. Мы должны быть заÑтрахованы от<br>
>   выдачи пуÑтых Ñтраниц клиентам!<br>
>   - Ðаконец, завиÑимоÑть от $host и $request_uri не требует комментариев.<br>
<br>
</div>СпаÑибо. Комментарий по поводу 304 и HEAD:<br>
<br>
1) HEAD должен отрабатыватьÑÑ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾ без дополнительных наÑтроек:<br>
 fastcgi_cache_key  "...$request_method...", то еÑть, у бÑкенда вÑÑ‘ равно<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><br>