web-dev-qa-db-fra.com

Nginx provoque la redirection 301 s'il n'y a pas de barre oblique de fin

J'exécute nginx dans une machine virtuelle en utilisant 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 pas ce que je veux.

Ce que j'ai essayé

Sur la base de ce que j'ai googlé, j'ai essayé server_name_in_redirect off; Et 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;
    }

}
44
That Brazilian Guy

J'ai publié une solution possible à ce problème sur serverfault ; reproduit ici pour plus de commodité:

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

Solution de base qui fonctionne pour moi

Si c'est le cas, j'ai trouvé que cette configuration try_files fonctionne:

try_files $uri $uri/index.html $uri/ =404;
  • La première $uri correspond exactement à l'uri
  • La 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.

Ma version mise à jour

Si vous ajoutez dans le bloc server:

index index.html index.htm;

Et modifiez try_files pour ressembler à ceci:

try_files $uri $uri/ =404;

Cela devrait aussi fonctionner.

19
John Weldon

Une solution un peu plus simple, qui a fonctionné pour moi, consiste à 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 on sur http://localhost:8080/foo, Je peux voir que l'en-tête Location dans la réponse HTTP de redirection est donné comme /foo/ et pas 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/

De là, je suppose que n'importe quel navigateur Web ferait la bonne chose avec l'emplacement relatif. Testé sur Chrome et cela fonctionne très bien.

12
guiccbr

essayez:

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;
        }
    }
}
10
luc2

Essayez de changer

server_name  localhost;
# server_name_in_redirect off;

à

server_name  localhost:8080;
server_name_in_redirect on;
5
Dave Turner