web-dev-qa-db-fra.com

Ajouter une barre oblique à la fin de chaque URL (besoin de réécrire la règle pour nginx)

J'essaie d'obtenir un "/" à chaque fin d'URL:

example.com/art

devrait

example.com/art/

J'utilise nginx comme serveur web.

J'ai besoin de la règle de réécriture pour cela ..

Pour une meilleure compréhension, vérifiez ceci:

http://3much.schnickschnack.info/art/projekte

Si vous appuyez sur une petite vignette sous la grande image, elle se recharge et affiche cette URL:

http://3much.schnickschnack.info/art/projekte/#

Si j'ai maintenant une barre oblique sur toutes les URL (à la fin), cela fonctionnerait sans recharger le site.

En ce moment, j'ai ces paramètres dans nginx-http.conf:

server {
  listen *:80;
  server_name 3much.schnickschnack.info;
  access_log /data/plone/deamon/var/log/main-plone-access.log;
  rewrite ^/(.*)$ /VirtualHostBase/http/3much.schnickschnack.info:80/2much/VirtualHostRoot/$1 last;
  location / {
    proxy_pass http://cache;
  }
}

Comment configurer nginx pour ajouter une barre oblique? (Je pense que je devrais une règle de réécriture?)

48
Gomez

Plus probablement, je pense que vous voudriez quelque chose comme ça:

rewrite ^([^.]*[^/])$ $1/ permanent;

L'expression régulière se traduit par: "réécrire tous les URI sans aucun '.' en eux qui ne se terminent pas par un '/' à l'URI + '/' "Ou simplement:" Si l'URI n'a pas de point et ne se termine pas par une barre oblique, ajoutez une barre oblique à la fin "

La seule raison de la réécriture d'URI sans points fait en sorte que tout fichier avec une extension de fichier n'est pas réécrit. Par exemple, vos images, css, javascript, etc. et empêcher d'éventuelles boucles de redirection si vous utilisez un framework php qui fait ses propres réécritures également

Une autre réécriture courante pour accompagner cela serait:

rewrite ^([^.]*)$ /index.php;

Cela réécrit très simplement tous les URI qui n'ont pas de points dans votre index.php (ou n'importe quel fichier à partir duquel vous exécuteriez votre contrôleur).

100
Bob Monteverde
rewrite ^([^.\?]*[^/])$ $1/ permanent;

pour éviter que les chaînes de requête d'une URL de repos ne soient marquées d'un /.

par exemple.

/ myrest/do? d = 12345

24
Marc

Pour nginx:

rewrite ^(.*[^/])$ $1/ permanent;
8
bryan

Bizarre que ce soit le premier résultat sur Google, mais n'a pas de réponse satisfaisante. Il y a deux bonnes façons de le faire, je le sais. La première consiste à vérifier directement si la demande atteindra un fichier et à n'appliquer une condition de réécriture que dans le cas contraire. Par exemple.

server {
   # ...
   if (!-f $request_filename) {
     rewrite [^/]$ $uri/ permanent;
   }
   location / {
      # CMS logic, e.g. try_files $uri $uri /index.php$request_uri;
   }
   # ...
}

La seconde, que beaucoup préfèrent car ils préfèrent éviter toute utilisation de si qui n'est pas nécessaire à 100%, consiste à utiliser try_files pour envoyer la demande à un bloc d'emplacement nommé lorsqu'elle ne frappera pas un fichier. Par exemple.

server {
   # ...
   location / {
      try_files $uri $uri/ @cms;
   }
   location @cms {
      rewrite [^/]$ $uri/ permanent;
      # CMS logic, e.g. rewrite ^ /index.php$request_uri;
   }
   # ...
}
2
Andrew Dinmore
server {
    # ... omissis ...

    # put this before your locations
    rewrite ^(/.*[^/])$ $1/ permanent;

    # ... omissis ...
}

Si vous souhaitez empêcher une sorte de requête (disons autre que GET) (généralement il s'agit de POST requêtes, car rewrite transforme n'importe quelle méthode de requête en GET, ce qui peut casser certaines des fonctionnalités dynamiques de votre site), ajoutez une clause if:

server {
    # ... omissis ...

    # put this before your locations
    if ($request_method = "GET" ) {
        rewrite ^(/.*[^/])$ $1/ permanent;
    }

    # ... omissis ...
}

Vous pouvez également placer le rewrite dans un bloc location (if aussi), pour le rendre plus spécifique.

1
Dmitri Sologoubenko

en utilisant les réécritures de anthonysomerset dans un Wordpress, j'ai expérimenté des problèmes d'accès au tableau de bord/wp-admin en raison de la boucle de réacheminement. Mais je résous ce problème en utilisant le conditionnel ci-dessus:

if ($request_uri !~ "^/wp-admin")
{
rewrite ^([^.]*[^/])$ $1/ permanent;
rewrite ^([^.]*)$ /index.php;
}
1
Ernesto Gámez

il est trop tard mais je veux partager ma solution, j'ai rencontré un problème avec la barre oblique de fin et nginx.

#case : 
# 1. abc.com/xyz  => abc.com/xyz/
# 2. abc.com/xyz/ => abc.com/xyz/
# 3. abc.com/xyz?123&how=towork => abc.com/xyz/?123&how=towork
# 4. abc.com/xyz/?123&ho=towork => abc.com/xyz/?123&how=towork

et c'est ma solution

server { 
    ....
    # check if request isn't static file
    if ($request_filename !~* .(gif|html|jpe?g|png|json|ico|js|css|flv|swf|pdf|xml)$ ) {
       rewrite (^[^?]+[^/?])([^/]*)$ $1/$2 permanent;
    }
    ....
    location / {
    ....
    }
}
0
Kai

Si nginx se trouve derrière le proxy avec https, cet extrait de code corrige la redirection pour $scheme

map $http_x_forwarded_proto $upstream_scheme {
    "https" "https";
    default "http";
}

server {
    ...
    location / {
        rewrite ^([^.\?]*[^/])$ $upstream_scheme://$http_Host$1/ permanent;
    }
    ...
}

Et sur le proxy en amont, passez le X-Forwarded-Proto en-tête comme:

location / {
    proxy_set_header X-Forwarded-Proto $scheme;
    ...
}
0
METAJIJI