先说下标题,适用于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
。