關於nginx的重定向問題

nginx作爲反向代理服務器的時候,如果端口設置的特殊,在重定向的時候可能遇到問題。當然可以通過在代碼中redirect一個絕對地址來規避這些端口問題,但是對代碼有侵入,也不優雅。還可以修改後端tomcat的proxyPort="xxx",xxx就是nginx的端口解決,這個值不設置就是默認,http對應80,https對應443。

在nginx處,都可以通過設置Host來解決,可以重定向到你想要的任何位置(ip和端口)。

proxy_set_header Host  $host:$server_port;

通過proxy_redirect指令也能處理部分情況。

proxy_redirect     http://host http://host:81;

nginx使用alias命令進行靜態頁面轉發的時候,如果是.../xxxx1/xxxx2這種會被重定向到.../xxxx1/xxxx2/,nginx運行在8080,防火牆出口是80,重定向的時候就出現問題。它重定向到了nginx的8080端口。

有兩種解決方式:

  1. 如果版本大於等於1.11.8,可以設置absolute_redirect off這樣重定向的頁面就是相對頁面,瀏覽器自動會加上ip和端口。
  2. 如果版本小於1.11.8,可以設置port_in_redirect off這樣在重定向的時候就沒有端口,也即默認端口。
  3. 兩個指令各有用處,看自己的nginx版本選用一種即可。

因爲版本用的是1.16.1,可以使用absolute_redirect off;來解決。

但是如果防火牆出口端口不是80,那就組好升級nginx使用absolute_redirect了。注意這種被重定向的頁面都會有緩存,所以測試的時候注意清空緩存。

參考https://blog.noroot.net/archives/676/

在某些極端的網絡環境下,比如防火牆出口端口爲80,nginx運行在8080,有一部分人通過外網80訪問,有一部分人通過內網8080訪問,此時就可以利用nginx的if指令判斷$host,指定不同的Host,實現完美的重定向。

爲什麼proxy反向代理和靜態頁面處理重定向的問題方法不一致呢?因爲反向代理後端是動態服務器,動態服務器在redirect的時候其實是通過拿到Host和Port組裝一個地址進行重定向,所以設置好$Host就行;而對於靜態頁面,沒辦法動態處理,所以nginx提供了port_in_redirect和absolute_redirect等指令來處理重定向。一點愚見,不知理解是否準確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章