2014-03-31 125 views
8

我知道這個問題已被多次詢問,但在嘗試了很多解決方案後,我仍然陷入困境。代理服務器傳遞URL中的Nginx尾部斜槓

我正在使用NginX將代理傳遞給NodeJs應用程序。我試圖讓網址https://example.com代理請求傳遞給http://example.com:8080/?

要求(從移動應用)的請求https://example.com//其nginx的是使http://example.com:8080//?這是行不通的。

事情我已經試過這都沒有奏效:

  • merge_slashes on;(這是在默認情況下)
  • rewrite ^/(.*)/$ /$1 permanent;
  • port_in_redirect off;

我的nginx的配置:

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; 
} 

回答

11

我想你使用沒有URI的proxy_pass。在這種情況下,nginx會傳遞原始URI,而不是標準化的URI。所以,你應該用proxy_pass http://backend/;

UPDATE

所以我是對的。只需添加URI部分proxy_pass這樣的:

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

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

正如nginx documentation指出,如果不使用的URI proxy_pass(即不經過服務器路徑:端口)的nginx會把URI從原來的要求,正是因爲它是所有雙斜線, ../等。

在另一側,URI在proxy_pass行爲像alias指令,指的nginx將替換匹配的位置的前綴(在出情況下,它在第一位置/a/a/爲秒)與URI在proxy_pass指令(我有意地部分與位置前綴相同),所以URI將與請求相同,但規格化(沒有雙斜線和所有員工)。 小心尾隨斜線。 Nginx將字面替換部分,你可能會得到一些奇怪的網址。

下面是一個在location中使用尾部斜線的示例,但在proxy_pass中沒有尾部斜線。

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

如果一個人去解決http://yourserver.com/one/path/here?param=1的nginx將代理請求http://127.0.0.1/twopath/here?param=1。瞭解如何連接twopath

+0

道歉爲更少的信息,但我的代理傳遞設置如下:: 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 ^〜/ 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提出了問題。在評論中很難閱讀 –

+0

@PratyayModi更新回答 –