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