在 nginx 中使用正则表达式组合多个位置

在 nginx 中使用正则表达式组合多个位置

我在域的子文件夹中动态安装 Joomla 的数量。

例如:

    http://site/joomla_1/
    http://site/joomla_2/
    http://site/joomla_3/
    ...

目前我有以下有效的配置:

index index.php;

location / {
    index index.php index.html index.htm;
}

location /joomla_1/ {
    try_files $uri $uri/ /joomla_1/index.php?q=$uri&$args;
}

location /joomla_2/ {
    try_files $uri $uri/ /joomla_2/index.php?q=$uri&$args;
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm/joomla.sock;
    ...
}

我正在尝试将 joomla_N 规则合并为一个:

location ~ ^/(joomla_[^/]+)/ {
    try_files $uri $uri/ /$1/index.php?q=$uri&$args;
}

但服务器开始按原样返回index.php(不调用php-fpm)。

看起来 nginx 在第一次匹配后就停止了正则表达式规则的处理。

有什么方法可以将这个规则与正则表达式之类的东西结合起来吗?

答案1

让我们了解一下事情:

http://wiki.nginx.org/HttpCoreModule#location

要确定哪个位置指令与特定查询匹配,首先检查文字字符串。文字字符串与查询的开头部分匹配 - 将使用最具体的匹配。然后,按照配置文件中定义的顺序检查正则表达式。第一个与查询匹配的正则表达式将停止搜索。如果没有找到正则表达式匹配,则使用文字字符串搜索的结果。

因此首先正则表达式停止搜索!

http://wiki.nginx.org/HttpCoreModule#try_files

按顺序检查文件是否存在,并返回找到的第一个文件。尾部斜杠表示目录 - $uri /。如果未找到任何文件,则调用内部重定向到最后一个参数。最后一个参数是后备 URI, 必须存在,否则将引发内部错误。

因此,最后一个参数try_files是一个内部 URL,如果未找到静态文件,则重新调用该链。

因此答案 1 有效,因为.php$仅当在 url 上调用内部重定向时正则表达式才会匹配,而不是joomla_[^/]始终在内部 php url 上匹配。

为了更好地理解,这也可以在 shell 上工作:

ln -s joomla_1 site_1
ln -s joomla_2 site_2 ...

nginx的:

location ~ ^/site_(\d+) {
    try_files $uri $uri/ /joomla_$1/index.php?q=$uri&$args;
}
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm/joomla.sock;
    ...
}

用户网址:

http://yoursite.tld/site_1/....

答案2

首先放置 .php 位置,然后放置其后:

location ~ ^/joomla_(\d+) {
  try_files $uri $uri/ /joomla_$1/index.php?q=$uri&$args;
}

相关内容