我的 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;
}
有什么方法可以将位置中的某些路径名作为正则表达式或通配符吗?
答案1
=
块中的修饰符是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
。由于正则表达式的工作方式,您的版本中不需要额外的字符。
答案2
顺序很重要,从nginx 的“位置”描述:
为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。
它的意思是:
- 第一个
=
. (“最长匹配前缀”匹配) - 然后是隐式的。(“最长匹配前缀”匹配)
- 然后是正则表达式。(第一个匹配)
您需要调整正则表达式各部分的顺序。