nginx踩坑系列之從http跳轉到https


背景介紹

項目前期使用http,后期為了安全方面的考慮,啟用了https。
項目架構:前端使用nginx作為多個tomcat實例的反向代理和負載均衡。
實際上只需要在nginx上啟用https即可,使客戶端與nginx之后使用https方式通信,而nginx與tomcat之間依然以http方式通信。

現在需要將之前客戶端所有的http請求全部都自動重定向為https,只需要在nginx上添加相應配置即可。
如下配置實現來源於Nginx HTTP 跳轉至 HTTPS,但是我都實踐驗證過。
另外,也加入了一些自己的理解整理而成。

使用rewrite指令

server {
    listen 80;
    server_name domain.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}
server {
    listen 443 ssl;
    server_name domain.com;
    ssl on;
    ssl_certificate     /etc/nginx/ssl/domain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
    # other
}

如果此時nginx作為Tomcat的前端反向代理的話,需要將相應配置放在配置ssl的server塊中。

使用return指令

server {
    listen 80;
    server_name domain.com;
    return 301 https://$server_name$request_uri;
}
server {
    listen 443 ssl;
    server_name domain.com;
    ssl on;
    ssl_certificate     /etc/nginx/ssl/domain.com.crt;
    ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
    # other
}

如果此時nginx作為Tomcat的前端反向代理的話,需要將相應配置放在配置ssl的server塊中。

使用error_page指令

只允許HTTP來訪問時,用HTTP訪問會讓Nginx報497錯誤,然后利用error_page將鏈接重定向至HTTPS上。

server {
    listen 80;
    listen 443 ssl;
    server_name domain.com;
    ssl on;
    ssl_certificate     /etc/nginx/ssl/domain.com.crt; 
    ssl_certificate_key /etc/nginx/ssl/domain.com.crt;
    # other
    error_page 497 https://$server_name$request_uri;
}

使用error_page指令時,將http和https的監聽配置寫在同一個server塊中,對應的其他配置也需要在該server配置塊中完成。
需要注意的是,此時需要將error_page指令語句寫在最后,否則不能生效。

【參考】
http://www.netingcn.com/nginx-rewrite-flag.html 關於nginx rewrtie的四種flag
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite rewrite指令
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return return指令
https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page error_page指定
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes 關於497狀態碼在nginx中的擴展應用


免責聲明!

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



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