我正在使用nginxconfiguration一个非常标准的networking服务器。 服务器按预期工作,但是,我想了解一个小的configuration细节。
我目前的configuration是:
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; }
有了这个configuration,如果我访问: http : //myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php我得到了一个404预期。
但是,有了这个configuration:
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由于security.limit_extensions
的默认值和您对于一个存在的.png文件的请求,不允许扩展名为.php和.php5。
长的回答:这与try_files在位置块内部或外部无关。 让我们来破解并解释:
请求是: http : //myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php
在你的第一个配置
location ~ .php$ { ... }
块,因为请求以.php
。 try_files $uri =404;
.php$
location导致nginx返回404,因为没有名为$ uri的文件(= / wp-content / uploads / 2012/10 / cropped-bitmap11.png / lol.php) location / { ... }
块永远不会匹配。 只有在没有其他位置块匹配时才匹配。 (请参阅http://wiki.nginx.org/HttpCoremodulee#location ) 在你的第二个配置
.php
,它匹配.php$
位置块。 /wp-content/uploads/2012/10/cropped-bitmap11.png
( /wp-content/uploads/2012/10/cropped-bitmap11.png
,它存在)并拒绝运行请求,因为.png扩展名。 (见简答) 我不知道这是一个错误还是“设计”,但是与“root”指令相反,位置块外的try_files指令不会在位置块内继承。 (有人可能会纠正这一点,如果它是错误的)