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