在nginx中将几个位置与正则expression式结合在一起

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

例如:

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

目前我有以下的工作configuration:

 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停止了第一个匹配之后的正则expression式规则的处理。

有什么办法可以将这个规则与正则expression式结合起来吗?

让我们了解一些事情:

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

要确定哪个位置指令与特定查询匹配,首先检查文字string。 文字string匹配查询的开始部分 – 将使用最具体的匹配。 之后,按照configuration文件中定义的顺序检查正则expression式。 匹配查询的第一个正则expression式将停止search 。 如果找不到正则expression式匹配,则使用文字stringsearch的结果。

所以第一个正则expression式停止search!

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

按顺序检查文件的存在,并返回find的第一个文件。 尾部的斜线表示一个目录 – $ uri /。 在没有find文件的情况下,调用到最后一个参数的内部redirect。 最后一个参数是回退URI,并且必须存在,否则会引发内部错误。

因此,如果没有find静态文件, try_files的最后一个参数就是一个链接被重新调用的内部url。

所以答案1的作品,因为.php$ regexp匹配只有当内部redirect被调用的URL,而不是joomla_[^/]总是匹配内部的PHPurl。

为了更好的理解,这也适用于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; ... } 

用户url:

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

把.php位置放在第一位,然后把它放在:

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