我在一台 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
。