1 votes

Combiner plusieurs emplacements avec regex dans nginx

Je dynamise le nombre d'installations Joomla dans les sous-dossiers du domaine.

Par exemple :

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

Actuellement, j'ai la configuration suivante qui fonctionne :

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

J'essaie de combiner les règles joomla_N en une seule :

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

mais le serveur commence à renvoyer index.php tel quel (n'appelle pas le php-fpm).

Il semble que nginx arrête le traitement des règles regex après la première correspondance.

Existe-t-il un moyen de combiner ces règles avec quelque chose comme les expressions rationnelles ?

2voto

rastrano Points 61

Comprenons bien les choses :

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

Pour déterminer quelle directive de localisation correspond à une requête particulière, on vérifie d'abord les chaînes littérales. sont vérifiées en premier. Les chaînes littérales correspondent au début de la de la requête - la correspondance la plus spécifique sera utilisée. Ensuite, reg le fichier de configuration. La première expression régulière qui correspond à l'expression arrêtera la recherche . S'il n'y a pas d'e n'est trouvée, le résultat de la recherche de la chaîne littérale est utilisé.

Donc la première regex arrête la recherche !

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

Vérifie l'existence des fichiers dans l'ordre, et trouvé. Une barre oblique finale indique un répertoire - $uri /. si aucun fichier n'est trouvé, une redirection interne vers le dernier est invoquée. Le dernier paramètre est la solution de rechange debe existent, sinon une erreur interne sera soulevée.

Ainsi, le dernier paramètre de la fonction try_files est une url interne sur laquelle la chaîne est réinvoquée si aucun fichier statique n'est trouvé.

La réponse 1 fonctionne donc parce que le .php$ n'est utilisée que lorsque la redirection interne est invoquée sur l'url, alors qu'elle l'est lorsque la redirection interne est invoquée sur l'url. joomla_[^/] correspond toujours à l'url interne de php.

Pour mieux comprendre, cela fonctionne également sur un 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;
    ...
}

Urls de l'utilisateur :

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

0voto

Brendonwbrown Points 126

Placez l'emplacement .php en premier, puis mettez ceci après :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X