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?)
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).
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
Pour nginx:
rewrite ^(.*[^/])$ $1/ permanent;
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;
}
# ...
}
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.
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;
}
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 / {
....
}
}
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;
...
}