我在域的子文件夹中的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; }