Combine vários locais com regex no nginx

1

Eu dinamizo o número de instalações do Joomla em subpastas do domínio.

Por exemplo:

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

Atualmente, tenho a configuração follwing que funciona:

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;
    ...
}

Estou tentando combinar as regras do joomla_N em uma:

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

mas o servidor começa a retornar index.php como está (não chama o php-fpm).

Parece que o nginx interrompe o processamento das regras de regex após a primeira partida.

Existe alguma maneira de combinar essas regras com algo como regex?

    
por Alex Netkachov 22.03.2012 / 20:34

2 respostas

2

Vamos entender as coisas:

link

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!

link

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/....
    
por 22.03.2012 / 23:30
0

Coloque primeiro o local .php e, depois, coloque:

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