Nginx 如何配置強制 HTTP 跳轉(zhuǎn) HTTPS 并保留原始請求參數(shù)
最推薦的做法是在監(jiān)聽 80 端口的 server 塊中使用 return 301 指令,配合 $request_uri 變量,這樣既能實現(xiàn)永久跳轉(zhuǎn),又能原生保留路徑和查詢參數(shù)。
先說結(jié)論:這是 Nginx 官方推薦的標(biāo)準(zhǔn)寫法,配置簡單且對搜索引擎友好,適合絕大多數(shù)已部署 SSL 證書的生產(chǎn)環(huán)境。
- 適合:已擁有有效 HTTPS 證書,希望統(tǒng)一流量入口的站點
- 先準(zhǔn)備:確認(rèn) 443 端口服務(wù)正常,備份現(xiàn)有配置文件
- 驗收:檢查跳轉(zhuǎn)狀態(tài)碼是否為 301,確認(rèn) URL 參數(shù)未丟失
命令速用版
如果你已經(jīng)有一個可用的 HTTPS server 塊,只需在配置文件中增加或修改監(jiān)聽 80 端口的 server 塊,核心配置如下:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}這段配置會攔截所有 HTTP 請求,并原樣跳轉(zhuǎn)到對應(yīng)的 HTTPS 地址。
為什么會這樣
HTTP 是明文傳輸,存在數(shù)據(jù)被竊聽或篡改的風(fēng)險,強制跳轉(zhuǎn) HTTPS 是為了保障通信安全。使用 301 狀態(tài)碼是因為它代表“永久移動”,瀏覽器和搜索引擎會記住這個規(guī)則,后續(xù)請求會自動嘗試 HTTPS,有利于 SEO 權(quán)重傳遞。
關(guān)于參數(shù)保留,Nginx 的 $request_uri 變量包含了客戶端請求的完整 URI,包括路徑和問號后面的查詢參數(shù)(args)。相比之下,如果只用 $uri 可能會丟失參數(shù),需要額外拼接 $args,而 $request_uri 是開箱即用的完整地址。
分步處理
1. 備份配置:在修改前務(wù)必備份當(dāng)前配置文件,防止語法錯誤導(dǎo)致服務(wù)不可用。
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
2. 編輯配置:打開 Nginx 配置文件(通常在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/),添加或修改監(jiān)聽 80 的 server 塊。確保 server_name 與你的 HTTPS 配置一致。
3. 語法檢查:修改完成后,先運行測試命令,確保沒有拼寫錯誤。
nginx -t
如果顯示 successful,再進行下一步;如果報錯,根據(jù)提示行號檢查拼寫。
4. 平滑重載:確認(rèn)無誤后,重載配置使改動生效,不會中斷現(xiàn)有連接。
nginx -s reload
怎么驗證是否生效
1. 命令行檢查:使用 curl 命令查看響應(yīng)頭,確認(rèn)狀態(tài)碼是 301 且 Location 指向 https。
curl -I http://example.com/?test=1
觀察返回頭中的 HTTP/1.1 301 Moved Permanently 和 Location: https://example.com/?test=1。
2. 瀏覽器驗證:在地址欄輸入 http 開頭的帶參數(shù)網(wǎng)址,觀察地址欄是否自動變?yōu)?https,且參數(shù)部分保持不變。
3. 日志確認(rèn):查看 Nginx 訪問日志,確認(rèn) 80 端口的請求狀態(tài)碼記錄為 301。
常見坑
1. 跳轉(zhuǎn)死循環(huán):如果 HTTPS 的 server 塊配置錯誤,也可能把請求又轉(zhuǎn)回 HTTP,導(dǎo)致瀏覽器報錯“重定向次數(shù)過多”。確保 443 端口配置中不再有 return 301 http 的邏輯。
2. $host 變量獲取異常:如果客戶端請求直接使用的是 IP 地址,$host 可能是 IP。如果證書只綁定域名,HTTPS 握手可能會失敗。建議 server_name 明確指定域名。
3. HSTS 影響:如果開啟了 HSTS(HTTP Strict Transport Security),瀏覽器會強制記住 HTTPS 策略。在調(diào)試期間如果配置錯誤,可能需要清除瀏覽器緩存才能恢復(fù) HTTP 訪問。
4. 反向代理場景:如果 Nginx 前面還有負(fù)載均衡器或 CDN,需要在跳轉(zhuǎn)邏輯中考慮 X-Forwarded-Proto 頭,避免在內(nèi)部網(wǎng)絡(luò)重復(fù)跳轉(zhuǎn)。
參考來源
- Nginx 官方文檔 - ngx_http_rewrite_module 模塊 return 指令說明
- Nginx 官方文檔 - ngx_http_core_module 模塊 內(nèi)置變量說明
到此這篇關(guān)于Nginx 如何配置強制 HTTP 跳轉(zhuǎn) HTTPS 并保留原始請求參數(shù)的文章就介紹到這了,更多相關(guān)Nginx 強制 HTTP 跳轉(zhuǎn) HTTPS 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux 系統(tǒng) nginx 服務(wù)器安裝及負(fù)載均衡配置詳解
nginx(engine x) 是一個 高性能 的 HTTP 和 反向代理 服務(wù)器、郵件代理服務(wù)器以及通用的 TCP/UDP 代理服務(wù)器。這篇文章主要介紹了Linux 系統(tǒng) nginx 服務(wù)器安裝及負(fù)載均衡配置詳解,需要的朋友可以參考下2019-07-07
Nginx安裝配置naxsi waf防火墻的方法實現(xiàn)
Naxsi是第三方nginx模塊,它也能有效防御,本文主要介紹了Nginx安裝配置naxsi waf防火墻的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Nginx 平滑升級的實現(xiàn)(拒絕服務(wù)漏洞)
本文主要介紹了Nginx 平滑升級的實現(xiàn)(拒絕服務(wù)漏洞),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

