Nginx:try_files在位置外部



我正在使用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指令不会在位置块内继承。(如果错误,有人可能会纠正)

最新更新