nginx泛域名http(80)强制跳转https(443)

nginx泛域名http(80)强制跳转https(443)

随着chrome浏览器在地址栏开始标注网站『不安全』的提示开始,各大小网站都开始从http转为https了,并且都更注重网站的安全了。然页我们之前的很多站点都是基于http开发的,如果全部改造成https,必然是很大的工作量,幸好有第三方的工具可以为我们解决这个问题,可以让原有的系统不改动的情况下,或者少改动的情况下就能够满足这个需求。nginx就是其中使用最为广泛的一个,并且它的响应最快,目前国内绝大多数平台或者系统在前端都使用的是nginx或者nginx的变种。

为每个域名(子域名)申请证书,然后配置nginx,这样就可以解决https证书问题。但为每个域名或者子域名都申请一个证书,暂起不说费用问题,申请也是比较麻烦的事,所以申请一个支持泛域名的能用证书是最方便的,所有子域名都可以使用该证书,肯定是最快捷的。

泛域名证书申请

推荐使用acme.sh来申请,下载地址和使用说明

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

安装很简单, 一个命令:

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

并且acme.sh 支持大多数国内知名dns的api方式。比如dnspod,aliyun,只需要在相应的平台上申请id和key即可使用api方式使用acme.sh,非常方便,申请证书一条命令就搞定了。
以下命令使用dnspod的api方式申请easex.cn泛域名证书,其下的所有子域名均可以使用。

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

申请到的证书默认存放在 当前用户的 ~/.acme.sh/easex.cn(域名)目录下。你可以copy出来,或者使用 acme.sh的install-cert命令来安装到指定目录。

nginx的配置

nginx的安装就不说了,在centos下通常用yum 来安装,也可以自己编译。这里只说配置一事。网上虽然有很多关于http跳转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 ,重点就在于 return 301 https://$http_host$request_uri; 这一句。在这里不得不提一下不管是使用$host还是$server_name,都不能让浏览器正常跳转到相应的子域名,只有使用$http_host这样才可以,困绕了我两天时间。
通过以上配置,80端口被强制跳转到了443,但443中通过 proxy_pass http://tomcat9/;实际还是跳转回了http的原始端口,但对外,浏览器和用户所看到的确实是https了,并且显示的是安全网站。

注意事项

服务器应该要开放 80 443端口。


上一篇
利用nginx与frp/ngrok实现内网穿透,将网站架在自己家里或者公司内部 利用nginx与frp/ngrok实现内网穿透,将网站架在自己家里或者公司内部
利用nginx与frp/ngrok实现内网穿透,将网站架在自己家里或者公司内部这个需求其实在天朝一直都是比较强烈的,对于一些小企业,或者是个人,能够把网站架在企业内部,或者家里是非常方便的一件事情,但现在国内,如果没有备案的域名往往是无法被
2019-04-17
下一篇
docker运行oracle12c注意事项 docker运行oracle12c注意事项
docker运行oracle12c注意事项docker的安装就不说了,这里主要说在docker中运行oracle的事情。首先oracle映像本身比较大,近2.8G,所以你的磁盘空间一定要够,再有运行时还需要大约7G的空间,所以空间要足够,再
2019-03-27