86 votes

Nginx provoque une redirection 301 s'il n'y a pas de barre oblique finale.

J'exécute nginx dans une machine virtuelle en utilisant le NAT et j'ai des problèmes de redirection lorsque j'y accède depuis la machine hôte.

Fonctionne comme prévu

  • http://localhost:8080/test/index.htm : fonctionne.
  • http://localhost:8080/test/ : fonctionne.

Ne fonctionne pas comme prévu

  • http://localhost:8080/test : redirige vers http://localhost/test/ . C'est no ce que je veux. (remarquez qu'il enlève le numéro de port)

Ce que j'ai essayé

En me basant sur ce que j'ai googlé, j'ai essayé server_name_in_redirect off; y rewrite ^([^.]*[^/])$ $1/ permanent; les deux sans succès.

Mon default.conf :

server {
    listen       80;
    server_name  localhost;
    # server_name_in_redirect off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
    # rewrite ^([^.]*[^/])$ $1/ permanent;
        root           /usr/share/nginx/html;
        try_files      $uri =404;
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass   unix:/tmp/php5-fpm.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

41voto

John Weldon Points 19132

J'ai posté une solution possible à ce problème sur défaut du serveur ; reproduit ici par commodité :

Si je comprends bien la question, vous voulez servir automatiquement, sans utiliser de redirection 301, http://example.com/foo/index.html lorsque la demande porte sur http://example.com/foo sans barre oblique de fin ?

Solution de base qui fonctionne pour moi

Si oui, j'ai trouvé cette configuration try_files pour fonctionner :

try_files $uri $uri/index.html $uri/ =404;
  • Le premier $uri correspond exactement à l'uri
  • Le deuxième $uri/index.html correspond à un répertoire contenant l'index.html où le dernier élément du chemin correspond au nom du répertoire sans barre oblique de fin
  • Le troisième $uri/ correspond au répertoire
  • Le quatrième =404 renvoie la page d'erreur 404 si aucun des modèles précédents ne correspond.

Tiré de Réponse au problème de serveur

Ma version actualisée

Si vous ajoutez le server bloc :

index index.html index.htm;

Et modifier try_files pour ressembler à ça :

try_files $uri $uri/ =404;

Cela devrait aussi fonctionner.

32voto

guiccbr Points 462

Une solution un peu plus simple, qui a fonctionné pour moi, est de désactiver les redirections absolues avec absolute_redirect off; comme dans l'exemple suivant :

server {
    listen 80;
    server_name  localhost;
    absolute_redirect off;

    location /foo/ {
        proxy_pass http://bar/;
    }

Si je lance curl sur sur http://localhost:8080/foo je peux voir que le Location dans la réponse HTTP de redirection est donné comme suit /foo/ et non http://localhost/foo/ .

$ curl -I http://localhost:8080/foo
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.8
Date: Tue, 03 Apr 2018 20:13:28 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: /foo/

A partir de là, je suppose que n'importe quel navigateur web ferait la bonne chose avec l'emplacement relatif. J'ai testé sur Chrome et cela fonctionne bien.

12voto

luc2 Points 157

Essayer :

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
        if (-d $request_filename) {
            rewrite [^/]$ $scheme://$http_host$uri/ permanent;
        }
    }
}

5voto

Dave Turner Points 697

Essayez de changer

server_name  localhost;
# server_name_in_redirect off;

à

server_name  localhost:8080;
server_name_in_redirect on;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X