2014-03-31 8 views
8

Ich weiß, dass diese Frage wurde mehrmals gestellt, aber nach einem Versuch, eine Menge Lösungen, die ich immer noch fest.NginX Schrägstrich in Proxy-Pass-URL

Ich benutze NginX zu Proxy-Pass zu einer NodeJs-Anwendung. Ich versuche url https://example.com Proxy die Anforderung an http://example.com:8080/?

Anfragen passieren zu machen (von einer mobilen App) fordern https://example.com// die nginx http://example.com:8080//? macht, was nicht funktioniert.

Dinge, die ich versucht habe, die nicht gearbeitet haben:

  • merge_slashes on; (die standardmäßig aktiviert ist)
  • rewrite ^/(.*)/$ /$1 permanent;
  • port_in_redirect off;

Meine nginx config:

location = /a { 
    proxy_pass http://127.0.0.1:8080; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_read_timeout 300; 
} 

location ^~ /a/ { 
    proxy_pass http://127.0.0.1:8080; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_read_timeout 300; 
} 

Antwort

11

Ich denke, Sie verwenden proxy_pass ohne URI. In diesem Fall übergibt nginx den ursprünglichen URI wie er war, nicht normalisiert. So sollten Sie verwenden proxy_pass http://backend/;

UPDATE

Also ich hatte recht. Fügen Sie einfach URI Teil so proxy_pass:

location = /a { 
    proxy_pass http://127.0.0.1:8080/a; 
    ... 
} 

location ^~ /a/ { 
    proxy_pass http://127.0.0.1:8080/a/; 
    ... 
} 

Wie ohne URI verwendet, wenn proxy_pass in nginx documentation angegeben (dh ohne Pfad nach Server: port) nginx wird von den ursprünglichen Anfrage stellt URI genau, wie es mit allen doppelten Schrägstrichen war, ../ und so weiter.

Auf der anderen Seite, URI in proxy_pass wirkt wie alias Richtlinie bedeutet nginx Teil, das Präfix übereinstimmt Stelle ersetzt (in outem Fall ist es /a in erster Stelle und /a/ Sekunde ist) mit URI in proxy_pass Richtlinie (die ich absichtlich gemacht Genau wie das Präfix für den Standort. Der URI ist also derselbe wie der angeforderte, aber normalisiert (ohne doppelte Schrägstriche und den gesamten Stab). Vorsicht: mit Schrägstrichen. Nginx ersetzt Teil buchstäblich und Sie könnten mit einer fremden URL enden.

Hier ist ein Beispiel mit Schrägstrich in location, aber kein Trailig Schrägstrich in proxy_pass.

location /one/ { 
    proxy_pass http://127.0.0.1:8080/two; 
    ... 
} 

wenn man http://yourserver.com/one/path/here?param=1 nginx wird Proxy-Anforderung zu http://127.0.0.1/twopath/here?param=1 Adresse gehen. Siehe, wie two und path verkettet.

+0

Entschuldigung für weniger Informationen, aber meine Proxy-Pass-Einstellungen sind wie folgt :: location =/a { proxy_pass http://127.0.0.1:8080; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $ remote_addr; proxy_read_timeout 300; } Standort^~/i/{ proxy_pass http: //127.0.0.1: 3001 /; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $ remote_addr; proxy_read_timeout 300; –

+0

@ PratyayModi stellen Sie in Frage. Es ist schwer, es in Kommentar zu lesen –

+0

@ PratyayModi aktualisierte Antwort –