Nginx:try_files外部位置

时间:2012-10-30 11:46:43

标签: configuration nginx

我正在使用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;
}

我得到一个“拒绝访问”的空白页面。

为什么结果不同?

谢谢

2 个答案:

答案 0 :(得分:14)

您可能认为服务器级try_files必须适用于每个请求。一点也不。恰恰相反,它仅适用于不匹配location块的请求。

答案 1 :(得分:2)

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

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