如何防止nginx缓存空白页?

如何防止nginx缓存空白页?

我在一台 Ubuntu 12.04 机器上运行着 nginx 1.4.3。我已将 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 请求。但我什么也没找到。

答案1

是的,变量是$request_method,这就是您要添加到的内容fastcgi_cache_key。这将导致 GET 和 HEAD 请求被分别缓存。

答案2

我相信您会想要将 http 方法添加到 中fastcgi_cache_key或者可能仅包含GET在 中fastcgi_cache_methods

相关内容