2017-10-17 39 views
0

網址代理我對3000端口運行的NodeJS + ExpressJS應用程序,它有一個路線:NGINX + ExpressJS - 反向在HTML

router.get('/getHello', function(req, res) { 
    res.send('Hello, world!'); 
}); 

和HTML網頁,其中執行此航線上的GET

<a href="/getHello"> 
    <input type="button" value="Visit Helo World page" /> 
</a> 

這個獨立的應用程序按預期工作。當按下按鈕時,它顯示Hello, world!

現在,這裏的問題:

我使用nginx這個應用程序的反向代理設置。下面是從sites-available的配置文件(sites-enabled鏈接)

server { 
    listen 80; 
    server_name localhost; 

    location /routetest/ { 
     proxy_pass http://127.0.0.1:3000/; 
     proxy_http_version 1.1; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-NginX-Proxy true; 
     proxy_set_header Host $host; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header X-Forwarded-Proto $scheme; 
     proxy_redirect off; 
     proxy_cache_bypass $http_upgrade; 
    } 
} 

的應用程序打開罰款當我訪問http://localhost/routetest但是當我按一下按鈕,它會打開http://localhost/getHello而我希望它打開http://localhost/routetest/getHello。由於http://localhost/getHello沒有定義,我結束了一個404(在另一方面,http://localhost/routetest/getHello正確返回Hello, world消息)

現在,我的問題是:

我的前端與/爲書面基本路徑(使所有的GET和POST請求),例如<a href="/getHello">,我覺得手動追加/routetest/之前我的HTML中的所有網址不是一個好習慣(因爲我可能想稍後更改此基本路徑,然後我會有隨處更新)。那麼,有沒有辦法讓NGINX或某express中間件爲使用/作爲基本路徑編寫的URL添加/routetest/,而無需手動在我的HTML中更改它?

回答

1

長遠來說,最簡單的解決方案是使用相對路徑,而不是領先的/,如果這是一個可用的選項。

在一般情況下,在響應中重寫URL是處於棘手和不可能之間。如果你認爲你能成功地識別你的內容的相關網址,你也許能夠使用的nginx的catchily題爲ngx_http_sub_module

http://nginx.org/en/docs/http/ngx_http_sub_module.html

有各種快遞中間件實現,做類似的事情,但我找不到一個看起來足夠可靠的建議。基本方法將類似於compression中間件,如果你喜歡自己動手。再一次,它一般很困難,但取決於你如何提供HTML的具體細節,它可能不會太糟糕。

+0

刪除領先的'/'作品,我同意這是最簡單的解決方案,但仍然需要我修改所有網址。我不知道爲什麼我在前端工作時沒有考慮相對URL。擁有相對URL是否是一種好習慣?有什麼缺點? –

+0

正如您所說,識別所有要修改的URL確實是一項棘手的任務,但我會盡量使用'ngx_http_sub_module'來嘗試。 –

+0

@Abhilashk我通常會使用相對URL,但他們也有問題。例如如果你有一個共享的頁面頭引用了一些CSS,但這些頁面並不在相對於該CSS的相同位置。我想有一些''的詭計可能會對此有所幫助,但我從未沿着這條路線走下坡路。我想HTML中的大多數URL都是'href =「/','src =」/'或'action =「/'形式,這可能不會太糟糕。對於JS來說,它可能是微不足道的,這取決於具體情況的惡夢。 – skirtle