it-swarm.com.de

Nginx führt eine 301-Umleitung durch, wenn kein abschließender Schrägstrich vorhanden ist

Ich starte Nginx in einer virtuellen Maschine mit NAT und es treten Umleitungsprobleme auf, wenn ich vom Host-Computer aus darauf zugreife.

Funktioniert wie erwartet

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

Funktioniert nicht wie erwartet

  • http://localhost:8080/test: Weiterleitung zu http://localhost/test/. Das ist nicht was ich will.

Was ich versucht habe

Basierend auf dem, was ich gegoogelt habe, habe ich server_name_in_redirect off; Und rewrite ^([^.]*[^/])$ $1/ permanent; ausprobiert, beide ohne Erfolg.

Meine 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

Ich habe eine mögliche Lösung für dieses Problem am Serverfehler gepostet. Der Einfachheit halber hier wiedergegeben:

Wenn ich die Frage richtig verstehe, möchten Sie automatisch ohne Verwendung einer 301-Umleitung http://example.com/foo/index.html liefern, wenn die Anforderung für http: //example.com/foo ohne abschließenden Schrägstrich?

Grundlösung, die für mich funktioniert

In diesem Fall hat die Konfiguration von try_files funktioniert:

try_files $uri $uri/index.html $uri/ =404;
  • Der Erste $uri stimmt genau mit dem uri überein
  • Der Zweite $uri/index.html stimmt mit einem Verzeichnis überein, das die index.html enthält, wobei das letzte Element des Pfads mit dem Verzeichnisnamen übereinstimmt, ohne einen abschließenden Schrägstrich
  • Der dritte $uri/ stimmt mit dem Verzeichnis überein
  • Die vierte =404 gibt die 404-Fehlerseite zurück, wenn keines der vorhergehenden Muster übereinstimmt.

Meine aktualisierte Version

Wenn Sie im Block server Folgendes hinzufügen:

index index.html index.htm;

Und ändere try_files so aussehen:

try_files $uri $uri/ =404;

Es sollte auch funktionieren.

19
John Weldon

Eine etwas einfachere Lösung, die für mich funktioniert hat, besteht darin, absolute Weiterleitungen mit absolute_redirect off; Zu deaktivieren, wie im folgenden Beispiel gezeigt:

server {
    listen 80;
    server_name  localhost;
    absolute_redirect off;

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

Wenn ich curl on auf http://localhost:8080/foo Ausführe, kann ich sehen, dass der Location -Header in der HTTP-Umleitungsantwort als /foo/ Und nicht als http://localhost/foo/ Angegeben wird.

$ 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/

Ich gehe davon aus, dass jeder Webbrowser mit dem relativen Standort das Richtige tun würde. Getestet auf Chrome und es funktioniert gut.

12
guiccbr

versuchen :

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

Versuchen Sie es zu ändern

server_name  localhost;
# server_name_in_redirect off;

zu

server_name  localhost:8080;
server_name_in_redirect on;
5
Dave Turner