2020年8月15日 星期六

nginx 使用return 與proxy_pass的差異

最近在做官網的移轉

舊的主機系統為Window的架構

新的主機則是Linux Docker架構

官網domain移轉後 原本有跑一些.net aspx的服務

就透過nginx轉回舊站上


轉回去是要用return 301 轉址還是用proxy_pass轉呢?

先說結論

如果是會經過瀏覽器顯示的網頁 使用return

如果是程式內執行的api使用proxy_pass

譬如說 www網站要移轉

我們把www給了新的主機, 舊的主機改用old 這網址

因此我們需要在新的主機上 把部分的www轉回old上


在新主機上使用return 網址上看到的網址會是old

如果程式內呼叫的api是透過return轉的

那麼程式內會先收到301 code而發生錯誤 而非你想像的

轉址後的api所產生的結果


而網頁的部分應該是透過browser呈現的

在收到 301 或307 都會自動轉到新的網址上

並不會出錯


在新主機上使用proxy_pass 看到的網址還是www 並不會因為內容是轉回old而顯示old

但是如果網頁的部分也使用proxy_pass 當然還是可以運作

但是每個連結就都會再經過新主機的nginx再轉過一次


另外透過proxy_pass 到old的domain上 是在主機內部運作

有可能發生不認得old這個domain 只要加上resolve dns就可以了

ex

location ~* .(php)$ {

  resolver 8.8.8.8 valid=30s;

  proxy_set_header Host $host;

  proxy_pass https://old.com$request_uri;

}


至於轉址的部分 透過$request_uri就可以取得host後面的完整網址

$args則是取得?後面的query參數

注意的是如果使用$request_uri 就不需要$args

ex: https://old.com/hello/me?name=oz&tel=123

$request_uri = /hello/me?name=oz&tel=123

$args = name=oz&tel=123


沒有留言: