Nginx下HTTP強制重定向至HTTPS


Nginx下HTTP強制重定向至HTTPS

對於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 ){
    return 301 https://$server_name$request_uri;
}

這樣就可以解決這一問題。

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

server {
    listen 80;
    ...
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    ...
}

歡迎轉載,轉載請注明出處!
獨立域名博客:flywill.cn
歡迎關注公眾微信號:Java小鎮V
分享自己的學習 & 學習資料 & 生活
想要交流的朋友也可以加微信號備注入群:EscUpDn


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM