Nginx:try_files之外的位置

我正在使用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$位置块。
  • 没有检查位置块内是否存在文件,请求直接传递给fastcgi进程。
  • fastcgi进程找到/wp-content/uploads/2012/10/cropped-bitmap11.png/wp-content/uploads/2012/10/cropped-bitmap11.png ,它存在)并拒绝运行请求,因为.png扩展名。 (见简答)

我不知道这是一个错误还是“设计”,但是与“root”指令相反,位置块外的try_files指令不会在位置块内继承。 (有人可能会纠正这一点,如果它是错误的)