nginx,从位置排除单个文件

时间:2013-08-22 14:48:04

标签: nginx

如何从某个位置排除单个文件?以下块负责全局PHP处理:

location ~ \.php$  {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

我想在这里做的是排除一个名为piwik.php的文件,因为它应该在一个单独的位置接受特殊处理。所以我的目标是让它看起来像这样

location ~ \.php$ && NOT /stats/piwik.php  {
    ...
}

如何实现这一目标?

1 个答案:

答案 0 :(得分:4)

当你看到答案时,你会踢自己。

  

我想在这里做的是排除一个名为piwik.php的文件,因为它应该在一个单独的位置接受特殊处理。

好的,您应该将该路径设置为默认路径之前的单独位置。 e.g。

location ~ ^/stats/piwik.php$ {
    allow 127.0.0.1;
    deny all;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

location ~ \.php$  {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

因为它们都是正则表达式位置块,所以在匹配的Nginx conf中首先列出的块将具有优先级。

但是,您可能应该保护整个目录。使用匹配的前缀位置规则可以更轻松地完成这项工作:

location ^~ /stats/ {
    allow 127.0.0.1;
    deny all;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

location ~ \.php$  {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 150;
    fastcgi_index index.php;
    include fastcgi_params;
}

因为匹配前缀具有正则表达式匹配的更高优先级,所以它们在你的nginx conf中的顺序无关紧要。对priority for matches is here

的一个很好的解释