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]匹配a和z之间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式部分的顺序。