Nginx + Apache Trailing Slash Redirect [geschlossen]

8

Ich habe einen NginxServer am 80Port, der als Proxy fungiert und Apache 2.2abhört127.0.0.1:8080

Wenn ich darauf zugreife http://hostname/subfolder/, funktioniert es großartig.
Wenn ich darauf zugreife http://hostname/subfolder, leitet es mich weiter, http://hostname:8080/subfolder/was falsch ist.

Soweit ich sehe, wird die falsche Weiterleitung von Apache aber zurückgegeben UseCanonicalNameund UseCanonicalPhysicalProxybeide sind auf eingestelltOff

Irgendwelche Ideen, wie man das behebt?

Quark
quelle
Das Problem scheint bei Ihrer Nginx-Konfiguration zu liegen, wenn man bedenkt, dass Ihr Zugriff auf Port 80 ohne einen abschließenden Schrägstrich zu einer Umleitung zu Port 8080 führt. WENN Ihr Nginx keinen Proxy für Apache ist und Apache eine Umleitung anordnet.
PP.
Ich benutze Nginx als Proxy
Quark

Antworten:

5

Ich bin auch darauf gestoßen und konnte es mit einer proxy_redirect-Direktive direkt nach meiner proxy_pass-Direktive in meiner nginx-Konfiguration beheben:

proxy_redirect http://example.com:8080/ http://example.com/ 

Dies ist meine vollständige Nginx-Konfiguration (In meinem Fall befindet sich Apache auf Port 81 und hostet zwei Sites. Ich habe zwei ortsspezifische proxy_redirect-Zeilen hinzugefügt, da ich nicht sicher bin, wie ich eine einzelne generische hinzufügen soll.)

server {
    listen 80;

    access_log /var/log/nginx/apache-proxy.access.log;

    location / {
        proxy_pass http://localhost:81;

        #fix for apache redirects that include the port number
        proxy_redirect http://nfriedly.com:81/ http://nfriedly.com/;
        proxy_redirect http://misticflame.com:81/ http://misticflame.com/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 6000;
        proxy_send_timeout 6000;
        proxy_read_timeout 6000;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        send_timeout 6000;
        proxy_buffering off;
        proxy_next_upstream error;

    }
}

Hinweis: Dies war vor 5 Jahren für eine Version vor 1.0 von Nginx. Hier sind die Dokumente für proxy_redirect für die aktuelle Version: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Nathan Friedly
quelle
Das Hinzufügen von proxy_redirect gibt den Syntaxfehler
TomSawyer
Dies war auf einer ziemlich alten Version von Nginx. Ich verwende kein Nginx mehr (nur statischen Inhalt auf Github-Seiten für meine persönliche Website), aber ich habe die Antwort mit einem Link zu den aktuellen proxy_redirect-Dokumenten aktualisiert.
Nathan Friedly
Auf diese Weise erhalten Sie es immer noch langsamer wegen der Umleitung
TomSawyer
2

Wenn Ihre Servername-Direktive in Apache auf "Hostname: 8080" festgelegt ist, entfernen Sie ": 8080" oder ändern Sie sie in "Hostname: 80". Sie können auch "proxy_set_header Host $ host: 80" hinzufügen.

user71577
quelle
1

Ich hatte dieses Problem vor langer Zeit. Wie ich mich erinnere, hat es mit dem HTTP-RFC zu tun. Ein Schrägstrich am Ende bezeichnet ein Verzeichnis (/ test /), kein Schrägstrich am Ende ist eine Datei (/ test).

Kurz gesagt, fügen Sie eine Umschreiberegel hinzu, die der Anforderung einen abschließenden Schrägstrich hinzufügt, falls keine vorhanden ist.

Schauen Sie sich Gelöst an: Problem mit abschließendem Schrägstrich mit dem Nginx-Server

HTP

Mihai
quelle
1

Ich bin kürzlich auf genau dieses Problem gestoßen. Während die vorgeschlagenen Lösungen funktionieren, bietet Nginx eine integrierte Lösung:

proxy_redirect default;

Dokumentation unter http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Hier ist ein vollständiges Beispiel für die Verwendung:

server {
  listen 80;
  location / {
    proxy_pass http://localhost:8080
    proxy_redirect default
  }
}
Dylan Wood
quelle
0

Möglicherweise setzt nginx die Proxy-Header nicht so, dass Apache erfährt, wie die ursprüngliche Anforderung aussah.

In Nginx:

proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Siehe http://wiki.nginx.org/LikeApache

Bohnen
quelle