Nginx下HTTP強制重定向至HTTPS

2021-09-29 22:43:18 字數 1159 閱讀 7994

對於nginx來說,配置http強制重定向至https有多種多樣的寫法。可以直接rewrite,也可以用301重定向。但是直接拷貝網上的配置往往會出現問題,所以應該考慮**具體的配置情況。

首先,從官方文件來看,對整個網域名稱通過正則匹配進行rewrite,然後以此來重定向至https的鏈結的方法官方是不推薦的。那麼首先重定向的語句就應該寫成:

return 301 https://$server_name$request_uri;
接著是重定向的語句應該放在**的問題。

對於編譯安裝的nginx,如果在編譯的時候沒有修改--prefix選項,配置檔案會在/usr/local/nginx/conf/nginx.conf。其中預設包含了兩個server段,乙個是開啟的,監聽80埠;另乙個被注釋掉了,監聽443埠(也即tls所需的埠)。

這兩個埠分別使用各自的server段。也就是說只要將80埠server段下的站點location設定複製到443埠server段下面,這樣就可以直接在80埠server段裡面新增重定向語句以達到重定向的目的。

對於其他方式安裝的nginx,或者自行修改過nginx.conf,那麼可能不包括443埠server段。這時候可以選擇像編譯安裝的預設配置一樣,另起乙個監聽443埠的server段。

但是如果覺得兩個 server 段過於冗長,這時候的另一種做法是在乙個server段裡面同時監聽80和443埠。如果這時候在這個server段裡面直接新增重定向語句,就會使得http/https訪問都會重定向到https。

看似沒有問題,但是仔細考慮一下就會發現,無論是http還是https都會無限地重定向下去。事實證明,在這種情況下chrome會報「重定向迴圈」的錯誤。

那麼明確問題之後,解決的方案就是只在訪問http時重定向。配置可以這麼寫:

if ( $scheme = http )
這樣就可以解決這一問題。

但是實際上,官方的文件中不推薦在文件中使用 if 語句(if is evil),所以最好的辦法還是使用兩個 server 段(乙個監聽80,另乙個監聽443)來解決問題。

server 

server

HTTP重定向處理

301 永久重定向,告訴客戶端以後應從新位址訪問.302 作為http1.0的標準,以前叫做moved temporarily 現在叫found.現在使用只是為了相容性的處理,包括php的預設location重定向用的也是302.但是http 1.1 有303 和307作為詳細的補充,其實是對302...

nginx重定向設定

不久前,公司業務平台上發現使用者訪問公司官方 時,攜帶兩個網域名稱的cookie到後端 分別時domain.com,www.domain.com 為了解決這個問題,首先分析公司對網域名稱的使用是否涉及到domain.com,發現沒有,那就有必要將訪問domain.com的使用者跳轉到www.doma...

HTTP協議學習(重定向)

http重定向 伺服器無法處理瀏覽器傳送過來的請求 request 伺服器告訴瀏覽器跳轉到可以處理請求的url上。瀏覽器會自動訪問該url位址,以至於使用者無法分辨是否重定向了。重定向的返回碼3xx說明。location響應首部包含了內容的新位址或是優選位址的url。301 在請求的url已被移除時...