NiceLeeのBlog 用爱发电 bilibili~

阿里云CentOS Nginx 关于HTTPS设置的二三事

2019-02-22
nIceLee

阅读:


先说下标题,适用于Linux,不论CentOS/Debian/Ubuntu等等,纯粹是因为第一台主机在阿里双十一剁手,选的是CentOS,从此入坑。。。
虽然说是个小破站,也没啥好加密的,但拿来练练手也是可以的。

前言

关于HTTP升级HTTPS,其实就是多了一层SSL层“管道”用来加密数据。
加密需要用到数字证书,这个最好是权威第三方,当然也可以是自己给自己签名,但这样浏览器会有告警提示。所以,一般是出钱去买咯。。。

  • 单纯HTTPS如何配置
  • HTTP 301到HTTPS

HTTPS配置

假设原来在HTTP中设置如下:

server
{
    listen 80;#监听端口

    server_name nicelee.top www.nicelee.top blog.nicelee.top;#域名
    if ( $host ~* (?!nicelee\.top$).*\.nicelee\.top ){
        rewrite ^/(.*)$ $scheme://nicelee.top/$1 permanent;#域名 全部重定向到 nicelee.top
    }
    root /homw/www;#站点目录
    error_page 404    /404.html;
    ...
}

那么,如果我想http/https的资源都可以使用的话,
+ 最简单的一个server监听两个端口
+ 一种办法是代理;
+ 另一种是全盘复制HTTP的server配置,再稍微修改一下。
如下:

  • Server监听两个端口
    server {
      listen    80;
      listen    443 ssl;
      server_name nicelee.top www.nicelee.top blog.nicelee.top;#域名
      ssl_certificate /cert/xxx.pem; #证书
      ssl_certificate_key /cert/xxx.key; #密钥
      ...
    }
    
  • 代理
    这种方法优点在于配置非常简单,啥也不用考虑,但缺点是绕了一圈,自己代理自己,占用了资源
    server
    {
      listen 443;
      ssl on;
      ssl_certificate /cert/xxx.pem; #证书
      ssl_certificate_key /cert/xxx.key; #密钥
      server_name _;#域名
      location /
      {
        proxy_pass http://127.0.0.1:80;
      }    
    }
    
  • HTTP的server配置上进行修改
    这种方法其实也比较简单,但需要注意部分rewrite中的协议设置,可能会导致部分资源无法使用,或出现绕路情况,详情如下:
    • 预期的状况: HTTPS 1 -> HTTPS 2
    • 现在的情况: HTTPS 1 -> HTTP 2
      在浏览器浏览HTTPS网页时,加载HTTP资源会报错。如果在header里面设置了
      <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
      那么浏览器会升级成HTTPS访问, HTTPS 1 -> HTTP 2 -> HTTPS 2
      这样虽然没有增加Nginx的负担,但是需要修改对应的html资源。
      当然,只要知道有这么回事就行了。配置如下:
server
{
    listen 443;
    ssl on;
    ssl_certificate /cert/xxx.pem; #证书
    ssl_certificate_key /cert/xxx.key; #密钥

    server_name nicelee.top www.nicelee.top blog.nicelee.top;#域名
    if ( $host ~* (?!nicelee\.top$).*\.nicelee\.top ){
        rewrite ^/(.*)$ $scheme://nicelee.top/$1 permanent;#域名 全部重定向到 nicelee.top
    }
    root /homw/www;#站点目录
    error_page 404    /404.html;
    ...
}

HTTP 301到HTTPS

某些情况下,同时提供HTTP/HTTPS资源(即HTTP/HTTPS均能访问,且浏览器地址栏均为对应协议)并不是我们想要的。
为了SEO等,我们需要将HTTP资源永久重定向到HTTPS。(尽管这会做出一些牺牲,比如原来的cookies没法在新网页生效)
第一种方法设置比较简单,但是耦合在一起可能会有些问题(如果没有那最好了😄)

server {
    listen    80;
    listen    443 ssl;
    server_name nicelee.top www.nicelee.top blog.nicelee.top;#域名
    ssl_certificate /cert/xxx.pem; #证书
    ssl_certificate_key /cert/xxx.key; #密钥
    if ( $scheme != 'https' ){
     rewrite ^(.*)$ https://$host$1 permanent;
    }
    ......
}

上面的后两种方法对应HTTP端的设置均相同,比较简单,都是301重定向:

server
{
    listen 80;
    server_name _;#域名
    rewrite ^(.*)$ https://$host$1 permanent;#// 把http的域名请求转成https
}

这里需要注意,前面的代理方法需要将原来的HTTP设置换个端口,然后HTTPS代理,然后HTTP重定向到HTTPS


内容
隐藏