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

Как предотвратить кеширование пустых страниц в nginx?

У меня 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.