我正在使用nginx配置一个非常标准的Web服务器。服务器正在按预期工作,但是,我想了解一个小的配置细节。
我目前的配置是:
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php?q=$uri;
}
location ~ .php$ {
try_files $uri =404;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
使用此配置,如果我访问:http://myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php不出所料,我得了404分。
然而,使用这种配置:
try_files $uri =404;
location ~ .php$ {
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
我收到一个空白页,上面写着"访问被拒绝"。
为什么结果不同?
谢谢
您可能认为服务器级别的try_files
必须为每个请求工作。一点也不。恰恰相反,它只适用于不匹配location
块的请求。
short-anwser:从php5.3.9开始,php-fpm不允许除了.php和.php5之外的扩展,因为security.limit_extensions
的默认值和您对现有.png文件的请求。
长答案:这与try_files位于位置块内部或外部无关。让我们来解释一下:
请求是:http://myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php
在您的第一个配置
- 它匹配
location ~ .php$ { ... }
块,因为请求以.php
结束 .php$
位置内的try_files $uri =404;
指令导致nginx返回404,因为没有名为$uri的文件(=/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php)- CCD_ 8块从不匹配。只有在没有其他位置块匹配的情况下才匹配。(参见http://wiki.nginx.org/HttpCoreModule#location)
在您的第二个配置上
- 再次,当请求以
.php
结束时,它匹配.php$
位置块 - 位置块中没有检查文件是否存在,请求直接传递给fastcgi进程
- fastcgi进程找到
/wp-content/uploads/2012/10/cropped-bitmap11.png
(看起来它存在),并由于.png扩展名而拒绝运行请求。(见简短回答)
我不知道这是一个bug还是"按设计"的东西,但与"根"指令相反,位置块外的try_files指令不会在位置块内继承。(如果错误,有人可能会纠正)