У меня nginx 1.4.3 работает на машине Ubuntu 12.04. У меня есть nginx, настроенный для кеширования страниц (они управляются базой данных, но остаются довольно статичными). Я использую MySQL и PHP-FPM.
Однако я обнаружил, что периодически кеширую пустые страницы. Никаких ошибок не было, и как только удаляю соответствующий файл из /var/cache/nginx
страница вернется.
После некоторого расследования я обнаружил, что проблема в том, что если получен запрос HEAD, nginx кэширует пустой ответ как полный ответ для этого URL. Так HEAD /example
сохраняет пустой файл в файле кеша для /example
страница и последующий GET /example
возвращает пустую страницу. (Кажется, я регулярно получаю запросы HEAD от различных поисковых систем и ботов.)
Вот соответствующая конфигурация сайта:
location ~ \.php$ {
try_files $uri =404;
fastcgi_cache one;
fastcgi_cache_key $scheme$host$request_uri;
fastcgi_cache_valid 200 5m;
fastcgi_cache_valid 301 302 304 12h;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/mysite/public$fastcgi_script_name;
fastcgi_param HTTPS off;
}
Это известная ошибка в nginx? Я не смог найти никакой информации по этому поводу, несмотря на различные поиски.
Есть ли обходной путь? Невозможно предотвратить кеширование запросов HEAD согласно этому.
Я подумал, может быть, есть переменная типа запроса, которую можно добавить в fastcgi_cache_key
, так что запросы HEAD и GET кэшируются отдельно. Но я ничего не могу найти.
Да, переменная $request_method
и это то, что вы захотите добавить к fastcgi_cache_key
. Это приведет к раздельному кэшированию запросов GET и HEAD.
Я считаю, что вы захотите добавить метод http в fastcgi_cache_key
или, возможно, только включать GET
в fastcgi_cache_methods
.