Frage Verhindert Portwechsel bei Weiterleitung in nginx


Ich habe derzeit Nginx-Setup, um Inhalte über Varnish zu liefern. Nginx hört Port 8000 und Lack verbindet Benutzeranforderungen von 80 bis 8000.

Das Problem ist, in einigen Fällen, insbesondere wenn Sie versuchen, ein Verzeichnis zu treffen, wie site.com/2010, nginx leitet die Anfrage an site.com:8000/2010/.

Wie kann ich das verhindern?


6
2018-01-27 18:21


Ursprung




Antworten:


Ich habe die Antwort auf diese Frage gefunden, indem ich die HttpCoreModule Dokumente.

port_in_redirect off;

Dies behält den Port bei, der vom Client während Weiterleitungen verwendet wird. Eng verwandt ist server_name_in_redirect der den ersten Hostnamen für Weiterleitungen verwendet. Da ich sitename.v.myserver.com nicht auf sitename.com umleiten wollte,


9
2018-02-01 01:21





Der Code hinter NGINX verwendet wahrscheinlich die FASTCGI-Variable SERVER_PORT, um zu bestimmen, wohin der Benutzer geleitet werden soll. SERVER_PORT enthält den Port, den nginx hört. In Ihrem Fall wäre das also 8000.

Sie können so etwas zu Testzwecken ausprobieren:

location ~ \.php$ {
        [...]
        fastcgi_param  SERVER_PORT 80;
}

angepasst an Ihre Konfiguration. Das ist ein schmutziger Hack, aber kann Ihnen helfen, das Problem zu diagnostizieren.


3
2018-01-28 01:22





I mein Fall nginx hört auf Port zu 80 in einem Andock-Container, aber es ist Port zugeordnet 8080 (oder irgendein zufälliger Port) außerhalb des Containers. Es gibt keinen Reverse-Proxy dazwischen, der richtige Header für den Port hinzufügen kann und auch nicht in der nginx-Konfiguration fest codieren möchte.

Beispiel für eine falsche Weiterleitung:

http://localhost:8080/directory -> http://localhost/directory/

Ich habe es versucht:

server {
  # ...
  port_in_redirect off;
  server_name_in_redirect off;
  # ...
}

Aber hat nicht funktioniert. Das einzige, was gut funktioniert hat, war:

server {
  # ...
  absolute_redirect off;
  # ...
}

Manuelle Eingabe fürabsolute_redirect sagt:

Wenn diese Option deaktiviert ist, sind Redirects, die von nginx ausgegeben werden, relativ.

Ich finde dies flexibler und erfordert nicht, dass der Servername und der Port irgendwo fest codiert sind.

Wenn Sie sich Sorgen über Weiterleitungen mit relativen URLs machen, überprüfen Sie dieser Kommentar.


3
2018-02-22 10:17



Gleiches Problem, Streit mit Nginx in Docker .. absolute_redirect off; Hilfreich ist es jedoch, wenn man gelegentlich Rewrite-Regeln auf externe Ressourcen umleiten muss, mit absolute_redirect set zu offMan wird es nicht können. Indem Sie es zu bestimmten hinzufügen location blockieren, kann man gezielt auf bestimmte Standortpfade zugreifen. - anapsix


Für diejenigen, die haben

  • Lack hört Port 80 ab
  • Backend-Server (in meinem Fall nginx) hört Port 8080

Das fastcgi_param SERVER_PORT sollte das gleiche wie das Frontend sein.

Also, ich setze

fastcgi_param  SERVER_PORT 80;

von Nginx auf die entsprechende URL umleiten.


2
2018-02-23 13:12