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

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

我的 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]之间的单个字符。这就是它对您不起作用的原因。az

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

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

location ~ \.php$ {
    return 404;
}

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

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

答案2

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

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

它的意思是:

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

您需要调整正则表达式各部分的顺序。

相关内容