Nginx通配符/正则表达式在位置路径中


22

我的Nginx配置抛出404,.php例如:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

但是我在子文件夹中有一些index.php文件要运行。当前配置如下:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

它工作正常,但是问题是重复的位置,如果有很多子页面,则配置会变得很大。

我尝试了*和一些正则表达式之类的通配符,它​​表示nginx测试已通过,但未加载页面(即404)。我尝试的是:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

有什么办法可以在该位置使用正则表达式或通配符作为路径名吗?

Answers:


32

块中的=修饰符location是完全匹配,没有任何通配符,前缀匹配或正则表达式。这就是为什么它不起作用。

尝试进行正则表达式时,请[a-z]a和之间匹配一个字符z。这就是为什么它对您不起作用的原因。

您需要按照以下方式设置位置。注意location语句的顺序。nginx选择第一个匹配的正则表达式条件。

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

我在这里使用区分大小写的匹配(用~修饰符代替~*)。在第一种情况下,我匹配路径的第一部分,然后匹配一个或多个数字的字母/数字字符,然后匹配index.php。您可以修改匹配范围,但请记住+“一个或多个”重复。

第二个匹配任何以结尾的URI .php。由于正则表达式的工作方式,您不需要版本中的多余字符。


谢谢,是的,正则表达式缺少主要的重复内容。+固定它。

1

顺序很重要,来自nginx的“位置”描述

为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串定义的位置(前缀位置)。其中,将选择并记住具有最长匹配前缀的位置。然后按照在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配项上终止,并使用相应的配置。如果未找到与正则表达式匹配的内容,则使用前面记住的前缀位置的配置。

它的意思是:

  • 第一=。(“最长匹配前缀”匹配)
  • 然后是隐式的。(“最长匹配前缀”匹配)
  • 然后是正则表达式。(第一场比赛)

您需要调整正则表达式零件的顺序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.