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 { ... } 

这怎么能实现?

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

我想在这里做的是排除一个名为piwik.php的文件,因为它应该在一个单独的位置得到特殊待遇。

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

 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中的顺序无关紧要。 比赛的优先顺序是在这里