Nginx的通配符/正则expression式的位置path

Nginx的configuration我已经抛出了404的.php像:

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

不过,我想要运行子文件夹中的一些index.php文件。 目前的configuration如下所示:

 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; } 

它完美的工作,但问题是重复的位置,如果有很多的子页面,那么configuration变得巨大。

我试图通配符*和一些正则expression式,它说nginxtesting通过,但不加载页面,即404。我试过的是:

 location = /sitename/*/index.php { fastcgi_pass phpcgi; } location ~* ^/sitename/[az]/index.php$ { fastcgi_pass phpcgi; } 

有没有什么办法,我可以在正则expression式或通配符的位置有一些path名?

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

在您的正则expression式尝试中, [az]匹配az之间a单个字符。 这就是为什么它不适合你。

您需要设置您的位置,如下所示。 注意location报表的顺序。 nginxselect第一个匹配的正则expression式条件。

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

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

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

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

要查找匹配给定请求的位置,nginx首先检查使用前缀string(前缀位置)定义的位置。 其中,匹配前缀最长的位置被选中并记住。 然后按照它们在configuration文件中出现的顺序检查正则expression式。 正则expression式的search在第一次匹配时终止,并使用相应的configuration。 如果找不到正则expression式的匹配,则使用先前记住的前缀位置的configuration。

它的意思是:

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

您需要调整正则expression式部分的顺序。