2014-07-08 7 views
5

Mein Titel ist nicht der beste, meine Kenntnisse von Webstuff ist ziemlich einfach, sorry.Server hinter Nginx Reverse Proxy ignoriert relativen Pfad in URL

Was ich

Ich habe eine Box fanbox läuft nginx auf Archlinux erreichen will, dass ich als Haupteinstiegspunkt zu mir nach Hause benutzen LAN aus dem Internet (nämlich arbeiten, wo ich nur in dem Hafen aussteigen kann 80 und 443) über die Reverse-Proxy-Einrichtung unter Verwendung eines sich ändernden Domain-Namens, über den ich keine Kontrolle habe und den wir home.net vorerst anrufen werden.

fanbox seine Ports 80 und 443 bis home.net abgebildet, war das Teil einfach.

Ich habe 2 webservers hinter der Firewall, web1.lan, web2.lan, web2ilo.lan. Beide haben verschiedene Anwendungen (die gleichen Namen auf verschiedenen Maschinen haben kann), die direkt auf dem LAN über Standard-URLs zugegriffen werden kann (die Namen werden als Beispiele gegeben, ich habe keine Kontrolle über den Inhalt):

http://web1.lan/phpAdmin/ 
http://web1.lan/gallery/ 
http://web2.lan/phpAdmin/ 
http://web2.lan/dlna/ 

... und so weiter ...

Jetzt web2ilo.lan ist ein besonderer Fall. Es ist die Out-of-Band-Management-Weboberfläche des HP Servers web2.lan. Dieser spezielle Web-Server bietet nur 1 Anwendung, so kann es nur über seine Stamm-URL zugegriffen werden:

http://web2ilo/login.html 

Mein Ziel ist es, diese über subpath von home.net wie diese zuzugreifen:

http://home.net/web1/phpAdmin/ 
http://home.net/web1/gallery/ 
http://home.net/web2/phpAdmin/ 
http://home.net/web2/dlna/ 
http://home.net/web2ilo/login.html 

Mein Problem

, dass fast funktioniert, aber die Web-Anwendungen sind in der Regel URLs neu zu schreiben, so dass, nachdem ich mich ein, um jeweils:

http://home.net/web1/phpAdmin/login.php 
http://home.net/web2ilo/login.html 

wird der Browser umgeleitet jeweils

http://home.net/phpAdmin/index.php 
http://home.net/index.html 

Beachten Sie, dass die relative Subpfade web1 und web2ilo, gegangen ist, die eine 404.

Meine Config

gib mir logisch So Bis jetzt habe ich viel gesucht und viele Optionen in nginx ausprobiert, ohne zu viel zu verstehen, was ich gemacht habe. Hier ist meine Konfiguration, die dieses Problem reproduziert. Ich habe SSL aus Gründen der Übersichtlichkeit weggelassen.

server { 
     listen  443 ssl; 
     server_name localhost; 

     # SSL stuff left out for clarity 

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

     location /web1/ { 
       proxy_set_header Host $host; 
       proxy_redirect off; 
       proxy_pass https://web1.lan/; 
     } 


     location /web2/ { 
       proxy_set_header Host $host; 
       proxy_redirect off; 
       proxy_pass https://web2.lan/; 
     } 

     location /web2ilo/ { 
       proxy_set_header Host $host; 
       proxy_redirect off; 
       proxy_pass https://web2ilo.lan/; 
     } 

    } 

Nach dem ersten Antworten

Nach den ersten paar Antworten (vielen Dank!), Ich merke, dass mein Setup weit von gemeinsam ist und dass ich für Probleme alleine zusteuern können.

Was wäre dann eine bessere Idee, auf den Webserver hinter der Firewall zuzugreifen, ohne Frontend-Ports und Domain/Hostname zu berühren?

+0

Sie explizit deaktivieren URL-Rewriting mit 'proxy_redirect off' und erwartet, dass es funktioniert. Komisch. –

+2

Ich folgte Beispielen, die ich googeln fand ... Ich habe mehrere Parameter für diese Option ausprobiert, kann aber kaum einen Unterschied feststellen. Also ich denke, meine ganze Herangehensweise ist völlig falsch. Nicht lustig nein. – FLBzh

Antwort

1

Sie können die Verwendung der Einstellung proxy_redirect in Erwägung ziehen, damit nginx weiß, dass die Backend-Serverantwortheader (Standort und Aktualisierung) an die entsprechenden Front-End-URLs angepasst werden sollen. Sie können entweder die default Einstellung nginx, damit die entsprechenden Werte aus dem location und proxy_pass Richtlinien zu berechnen, oder explizit die Zuordnungen angeben wie unten:

proxy_redirect http://web1.lan/ /web1/ 

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

Hinweis: dies nur betrifft Antwort-Header - keine Links in HTML-Inhalt oder Javascript.

Wenn Sie Probleme mit Links in Inhalt oder Javascript haben, können Sie entweder den Inhalt auf den Backend-Servern ändern (was möglicherweise nicht möglich ist) oder die Proxy-Lösung so anpassen, dass die Front-End-Pfade identisch sind als Back-End-Einsen (z. B. statt http://frontend/web1/phpAdmin haben Sie einfach http://frontend/phpAdmin). Dies würde location Richtlinien für jede Anwendung mit sich bringen Zugabe, zum Beispiel

location /phpAdmin/ { 
    proxy_set_header Host $host; 
    proxy_redirect off; 
    proxy_pass https://web1.lan/phpAdmin/; 
}   
+0

Punkt 1: Ich habe beide versucht, aber nicht genug, um einen Unterschied zu bemerken. Ich werde das Dokument lesen und Tests durchführen. – FLBzh

+0

Punkt 2: Hört sich gut an, aber es deckt nicht einen bestimmten Fall ab, den ich in meiner Frage nicht erwähnt habe ... Ich dachte nicht, dass es nötig wäre. Ich werde bearbeiten. – FLBzh