我正在使用nginx配置一个非常标准的网络服务器。服务器正在按预期工作,但是,我想要了解一个小的配置细节。
我目前的配置是:
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;
}
我得到一个“拒绝访问”的空白页面。
为什么结果不同?
谢谢
答案 0 :(得分:14)
您可能认为服务器级try_files
必须适用于每个请求。一点也不。恰恰相反,它仅适用于不匹配location
块的请求。
答案 1 :(得分:2)
短吻合,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
结尾。 try_files $uri =404;
位置内的.php$
指令导致nginx返回404,因为没有名为$ uri的文件(= / wp-content / uploads / 2012/10 / cropped-bitmap11.png / lol。 PHP)location / { ... }
块从不匹配。只有在没有其他位置块匹配时才匹配。 (见http://wiki.nginx.org/HttpCoreModule#location)
.php
结尾时,它与.php$
位置块匹配。/wp-content/uploads/2012/10/cropped-bitmap11.png
(显然,它存在)并拒绝运行请求,因为.png扩展名。 (见简答)我不知道它是一个bug还是“按设计”的东西,但是,与“root”指令相反,位置块之外的try_files指令不会在位置块内继承。 (如果错误,有人可能会纠正这个问题)