nginx泛域名http(80)強(qiáng)制跳轉(zhuǎn)https(443)


title: nginx泛域名http(80)強(qiáng)制跳轉(zhuǎn)https(443)
date: 2019-04-17 12:30:05
categories: 架構(gòu)
author: mrzhou
tags:

  • nginx
  • web
  • http
  • https

nginx泛域名http(80)強(qiáng)制跳轉(zhuǎn)https(443)

隨著chrome瀏覽器在地址欄開始標(biāo)注網(wǎng)站『不安全』的提示開始,各大小網(wǎng)站都開始從http轉(zhuǎn)為https了,并且都更注重網(wǎng)站的安全了。然頁我們之前的很多站點(diǎn)都是基于http開發(fā)的,如果全部改造成https,必然是很大的工作量,幸好有第三方的工具可以為我們解決這個問題,可以讓原有的系統(tǒng)不改動的情況下,或者少改動的情況下就能夠滿足這個需求。nginx就是其中使用最為廣泛的一個,并且它的響應(yīng)最快,目前國內(nèi)絕大多數(shù)平臺或者系統(tǒng)在前端都使用的是nginx或者nginx的變種。

為每個域名(子域名)申請證書,然后配置nginx,這樣就可以解決https證書問題。但為每個域名或者子域名都申請一個證書,暫起不說費(fèi)用問題,申請也是比較麻煩的事,所以申請一個支持泛域名的能用證書是最方便的,所有子域名都可以使用該證書,肯定是最快捷的。

泛域名證書申請

推薦使用acme.sh來申請,下載地址和使用說明

https://github.com/Neilpang/acme.sh

安裝很簡單, 一個命令:

curl  https://get.acme.sh | sh

并且acme.sh 支持大多數(shù)國內(nèi)知名dns的api方式。比如dnspod,aliyun,只需要在相應(yīng)的平臺上申請id和key即可使用api方式使用acme.sh,非常方便,申請證書一條命令就搞定了。
以下命令使用dnspod的api方式申請easex.cn泛域名證書,其下的所有子域名均可以使用。

acme.sh --issue -d easex.cn -d *.easex.cn --dns dns_dp

申請到的證書默認(rèn)存放在 當(dāng)前用戶的 ~/.acme.sh/easex.cn(域名)目錄下。你可以copy出來,或者使用 acme.sh的install-cert命令來安裝到指定目錄。

nginx的配置

nginx的安裝就不說了,在centos下通常用yum 來安裝,也可以自己編譯。這里只說配置一事。網(wǎng)上雖然有很多關(guān)于http跳轉(zhuǎn)https的配置,但都只針對單域名的,對泛域名都無法使用。
以下是本人使用著的配置,供大家參考。

upstream tomcat9 {
    server 127.0.0.1:8080;
}
server {
    listen 80;
    server_name *.easex.cn;
    return 301 https://$http_host$request_uri;
}
server {
    listen 443 ssl http2;
    server_name *.easex.cn;
    
    ssl_certificate     cert/easex.cn/fullchina.cer;
    ssl_certificate_key cert/easex.cn/easex.cn.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSV1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    
    access_log logs/easex.cn_access.log;
    error_log  logs/easex.cn_error.log;
                
    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;

        proxy_pass http://tomcat9/;
    }

}

這里的server_name均指定的為 *.easex.cn ,重點(diǎn)就在于 return 301 https://$http_host$request_uri; 這一句。在這里不得不提一下不管是使用host還是server_name,都不能讓瀏覽器正常跳轉(zhuǎn)到相應(yīng)的子域名,只有使用$http_host這樣才可以,困繞了我兩天時間。
通過以上配置,80端口被強(qiáng)制跳轉(zhuǎn)到了443,但443中通過 proxy_pass http://tomcat9/;實(shí)際還是跳轉(zhuǎn)回了http的原始端口,但對外,瀏覽器和用戶所看到的確實(shí)是https了,并且顯示的是安全網(wǎng)站。

注意事項(xiàng)

服務(wù)器應(yīng)該要開放 80 443端口。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容