82 votes

Comment puis-je créer un emplacement dans nginx qui fonctionne avec ET sans slash de fin ?

Actuellement, j'ai cette configuration :

location ~ ^/phpmyadmin/(.*)$
{
        alias /home/phpmyadmin/$1;
}

Cependant, si je visite www.mysite.com/phpmyadmin (notez l'absence de barre oblique), il ne trouve pas ce que je cherche (404). Je suppose que c'est parce que je n'ai pas inclus la barre oblique de fin. Comment puis-je résoudre ce problème ?

75voto

kbec Points 855

La meilleure solution :

location ~ ^/phpmyadmin(?:/(.*))?$ {
    alias /home/phpmyadmin/$1;
}

Assurez-vous que le serveur a les autorisations nécessaires pour /home/phpmyadmin d'abord.


Explication de la différence avec la réponse acceptée :

Il s'agit de expressions régulières .

Tout d'abord, le ^ char signifie que vous voulez faire correspondre le début de la chaîne et non le milieu. Le site $ à la fin signifie que la correspondance se fait jusqu'à la fin de la chaîne.

En (?:) signifie groupe non capturant - nous ne le voulons pas dans les résultats de capture, mais nous voulons simplement regrouper certains personnages. Nous le regroupons comme ceci, parce que nous voulons que le groupe / char pour être une partie non significative du chemin enfant, et non une partie significative du chemin parent.

49voto

haymaker Points 1234

C'est peut-être dans l'expression régulière que vous utilisez

location ~ ^/phpmyadmin/(.*)$

L'exemple ci-dessus correspondra à /phpmyadmin/, /phpmyadmin/anything/else/here, mais pas à /phpmyadmin car l'expression régulière inclut la barre oblique de fin de ligne.

Vous voulez probablement quelque chose comme ça :

location ~ /phpmyadmin/?(.*)$ {
    alias /home/phpmyadmin/$1;
}

Le point d'interrogation est un quantificateur d'expression régulière et doit indiquer à nginx de faire correspondre zéro ou un du caractère précédent (la barre oblique).

Attention : La communauté a vu cette solution, telle quelle, comme une possible risque pour la sécurité

12voto

Ryan Sampson Points 2898

Pourquoi n'utiliseriez-vous pas simplement

location /phpmyadmin {
    alias /home/phpmyadmin;
}

?

10voto

dlouzan Points 171

Je sais qu'il s'agit d'une vieille question, mais pour toute personne qui atterrit ici via Google, je l'ai résolue de la manière suivante (variante de celle de @kbec, qui était assez bonne) :

location ~ ^/foo(/.*)?$ {
  proxy_pass http://$backend$1$is_args$args;
}

Cela permettra de capturer toute variation de /foo et le redirige vers /bar sur une autre url (y compris les paramètres). Je l'affiche avec un proxy_pass mais cela fonctionnerait également avec la directive alias .

  • /foo -> /bar
  • /foo/ -> /bar/
  • /foo/sub -> /bar/sub
  • /foo/sub1/sub2/?param=value -> /bar/sub1/sub2/?param=value

Cela fonctionne parce que $1 capturera optionnellement les sous-ressources plus le slash de tête, donc il ne capturera pas des choses comme /fooextra/ . Il redirigera aussi correctement un slash présent ou non présent.

EDIT : Vérifiez les commentaires pour les mises en garde concernant cette approche.

3voto

Oriol Points 361

Cette redirection permettra uniquement réécrire les URL avec et sans la barre oblique de fin de ligne. Tout ce qui vient après la barre oblique ne sera pas écrasé.

domain.com/location => redirigé vers domain.com/new/location
domain.com/location => redirigé vers domain.com/new/location
domain.com/location/autre => non redirigé

server {
  # 301 URL Redirect
  rewrite ^/location/?$ /new/location permanent;
}

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