tl;dr
如果你在處理 nginx 重定向時要獲取原請求的網域名稱(比如 http 到 https),請用 $host 而不是 $server_name 。
問題和解決方案
今天碰到乙個問題,伺服器上乙個子網域名稱的請求重定向到另乙個子網域名稱上面去了。查了一段時間發現這個問題只有在 http 到 https 跳轉的時候才會發生。大概是這樣:
從 http 的 sub2 子網域名稱跳轉到 https 的 sub1 子網域名稱
->
我用的 nginx ,當初為了讓 http 請求跳轉到同名的 https 請求,配置如下:
}因為 301 是永久重定向,某些瀏覽器的快取會記住重定向,下次訪問原位址就會直接向新位址發請求,所以這個問題在瀏覽器裡面不一定重現得了(包括 chrome 的 incognito window),能每次完整重現的方式只有 curl 。
查了一下,發現問題出在$server_name變數上。這個變數會始終返回 server_name 中第乙個名字。這裡其實應該用$host變數。修改後的配置如下:
}$host變數會按照以下優先順序獲取網域名稱:
這幾乎可以保證在任何環境下正確地得到網域名稱。如果是同網域名稱下的重定向最好都用 $host 。
參考資料
ngiwww.cppcns.comnx wiki - $host
nginx 官方文件。其中對 $host 講的比www.cppcns.com較詳細,但 $server_name 只是一筆帶過。
stackoverflow 上關於三個變數區別的討論。裡面提到了為什麼 $host 是適用於所有場景的唯一選擇。
http/1.1 規範中對 request-line 的描述。
本文標題: nginx 重定向時獲取網域名稱的方法示例
本文位址:
Nginx 重定向時獲取網域名稱
如果你在處理 nginx 重定向時要獲取原請求的網域名稱 比如 http 到 https 請用 host而不是 server name。從 http 的 sub2 子網域名稱跳轉到 https 的 sub1 子網域名稱 我用的 nginx 當初為了讓 http 請求跳轉到同名的 https 請求,配...
nginx網域名稱重定向遇到的問題
應客戶要求,需要給客戶配個網域名稱,然後我們的大牛強哥 建議後台不要配備網域名稱伺服器了,這樣不安全,一般都是對外的web伺服器才配置網域名稱 結合另外收藏的乙個博文安裝nginx,然後修改配置檔案如下 乙個網域名稱對應乙個conf檔案 server location share location ...
2019 05 14 nginx根網域名稱重定向配置
碰到這樣乙個場景,假設需要發布乙個 123.com,但是後端服務的location有且僅有 abc,為了方便使用者快速使用,需要將 123.com根網域名稱的訪問請求轉到 123.com abc。或者同乙個網域名稱下有多個後端location,但是對於根網域名稱的訪問希望能自動轉向門戶。可以通過下面...