Vamos entender as coisas:
To determine which location directive matches a particular query, the literal strings are checked first. Literal strings match the beginning portion of the query - the most specific match will be used. Afterwards, regular expressions are checked in the order defined in the configuration file. The first regular expression to match the query will stop the search. If no regular expression matches are found, the result from the literal string search is used.
Então, primeiro regex pare de pesquisar!
Checks for the existence of files in order, and returns the first file that is found. A trailing slash indicates a directory - $uri /. In the event that no file is found, an internal redirect to the last parameter is invoked. The last parameter is the fallback URI and must exist, or else an internal error will be raised.
Portanto, o último parâmetro do try_files
é um URL interno no qual a cadeia é reinvocada se nenhum arquivo estático for encontrado.
Portanto, a resposta 1 funciona porque a .php$
regexp é correspondida apenas quando o redirecionado interno é invocado na URL, em vez de joomla_[^/]
estar correspondendo sempre também na URL interna do php.
Para entender melhor também isso funciona em um 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;
...
}
User urls:
http://yoursite.tld/site_1/....