轉自:https://www.cnblogs.com/pencile/p/Nginx_http_to_https.html
小目標:在只監聽一個端口的情況下,將http訪問跳轉為https。
一般情況下http協議使用80端口,https協議443端口。要實現http強制轉https是非常簡單的事,隨便都可以找到很多方案。使用非默認端口時這就變得有點麻煩了。
曾經看過一篇文章講述如何讓http 和https 在一個端口上工作。原理大概是以tcp方式監聽,檢查傳入的前幾個字節,從而判斷出是HTTP還是HTTPS的請求,再將數據轉發到相應端口上。這種方式非常強悍,但如果僅僅是讓http跳轉到https有點殺雞用牛刀的感覺。
最近無意中看到一篇有關Nginx的文章,其中提到了一個497的狀態碼:
Nginx internal code used for the plain HTTP requests that are sentto HTTPS port to distinguish it from 4XX in a log and an error pageredirection.
由此可見Nginx內部是可以檢測到錯誤的請求的。因此可以嘗試通用error_page去攔截。 配置代碼:
error_page 497 https://$host:$server_port$uri$is_args$args;
重啟Nginx 后,使用瀏覽器以http訪問網站,跳轉了!!!
由此證明用error_page攔截497實現http跳轉https是可行的。
PS:error_page可以作為server節點的局部配置也可以放在http節點作為全局配置。