前不久我给自己的博客开启了全站https,说过会发个教程,所以便有了这篇文章。
其实使用https理论上是会使网站变慢的(具体原因这里便不再阐述,感兴趣的可以自己去查一下,另http2除外),从这一点来看是不利于用户体验的,而且启用https甚至对SEO有影响,网站的收录可能会波动一段时间。既然如此,我们为什么还要给网站加上https这把锁呢?这里摘录搜狐的一篇文章的一段话。
为什么需要HTTPS?
HTTP全名超文本传输协议,它是网络应用广泛使用的协议,客户端据此获取服务器上的超文本内容。客户端包括浏览器、PC软件客户端以及大部分 手机App。超文本内容则以HTML为主,客户端拿到HTML内容后可根据规范进行解析呈现。因此,HTTP主要负责的是“内容的请求和获取”。
问题就出在这部分。内容请求和获取时会经过许多中间人,主要是网络环节,充当内容入口的浏览器、路由器厂商、WIFI提供商、通信运营商,如果使用了代理、翻墙软件则会引入更多中间人。由于HTTP请求的路径、参数默认情况下均是明文的,因此这些中间人可以对HTTP请求进行监控、劫持、阻挡。一些关键参数比如登录密码开发者会在客户端进行MD5加密,不过互联网所承载的机密信息远不只是密码,搜索内容同样属于敏感信息。
在没有HTTPS时,运营商可在用户发起请求时直接跳转到某个广告,或者直接改变搜索结果插入自家的广告。浏览器和安全软件可以监听用户搜索在 结果页植入广告。一些中间人还可把用户数据直接转卖,这样你搜索了“保险”以后你就成了保险公司电话推销的目标。如果劫持代码出现了BUG,则直接让用户 无法搜索,出现白屏。
不只是搜索引擎,其他的网络应用同样会面临这些问题:数据泄露、请求劫持、内容篡改等等,核心原因就在于HTTP是全裸式的明文请求,域名、路 径和参数都被中间人们看得一清二楚。HTTPS做的就是给请求加密,让其对用户更加安全。对于自身而言除了保障用户利益外,还可避免本属于自己的流量被挟 持,以保护自身利益。
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击。不过HTTPS是现行架构下最安全的解决方案,并且它大幅增加了中间人攻击的成本。
好了,接下来我们回到正题,如何启用全站https
如果在这之前你了解过一些相关内容,你就会知道我们需要申请ssl证书,我使用的是沃通的免费证书,只要验证域名所有权即可,很快就能签发证书。沃通的免费SSL证书免费两年,到期可以免费续期,相当于完全免费。
以沃通免费证书为栗子例子,先到对应的网站申请证书
取得证书后,将其解压,根据你的服务器环境选择对应的文件解压,上传到服务器上,位置自己选择
需要注意的是,上传上去的是应该是俩个文件,一个是公钥,一个是私钥。以Nginx为例,应该是一个.key后缀的文件和一个.crt后缀的文件
然后便是要修改对应的vhost的配置,这个便需要参考对应的证书提供商的文档了,这里以Nginx环境,使用沃通免费证书为栗子
在原来的的
listen 80; server_name 你的域名;
下面加上
listen 443 ssl; server_name 你的域名; ssl on; ssl_certificate .crt 文件位置 【必须使用绝对路径】; ssl_certificate_key .key 文件位置 【必须使用绝对路径】; #其他参数 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL; ssl_prefer_server_ciphers on;
其中其他参数后面需要根据你的SSl证书提供商的文档来配置。 附:沃通免费证书部署指南
做完这些之后,保存文档,然后重启一下Nginx(不会的话你就干脆直接重启服务器)然后博客是不是就可以用https访问了呢。
但是教程还没完成呢,这只是启用了https,我们要的是全站https,接下来就要对Wordpress动以一些手手术了
首先进入Wordpress的后台 => 设置 => 常规中,把 WordPress地址(URL)和站点地址(URL)加上一个s
改完这个文章什么的连接就自动改成https了,但是还有个很严重的问题,就是图片,当初你发文章插入图片的时候Wordpress可是在数据库妥妥的给你写入了“http://”这个有两种解决方法。
第一种:修改数据库
如果你要采用第一种方法,建议还改之前先去主机商那边创建一个快照,就是备份一下。
进入 phpMyAdmin,打开 Wordpress 的 wp_posts 表,搜索,查找与替换(Find and replace)
这里以我的博客 yingfeng.me 为例,搜索 http://yingfeng.me 替换为 https://yingfeng.me 字段选第一个 post_content 点击执行
第二种:修改主题
找到当前主题的 function.php 文件,在这个文件的末尾追加以下代码:
/* 替换图片链接为 https */ function my_content_manipulator($content){ if( is_ssl() ){ $content = str_replace('http://你的域名/wp-content/uploads', 'https://你的域名/wp-content/uploads', $content); } return $content; } add_filter('the_content', 'my_content_manipulator');
这个方法的原理是在 Wordpress 加载附件之前将链接替换成https,注意把“你的域名”替换成你的域名,别直接在php里面就是直接写了你的域名 23333
好了,到这一步就就Wordpress本身就已经实现了全站https了但是还有很多插件啊,比如多说等
使多说支持https
多说用的人还是很多,这里说一下多说如何完美支持https,其实多说本身是支持https,但是第三方头像,比如新浪就不支持https了,所以我们就写一个 php 来做代理
这儿已经准备好了代码,只要稍作修改即可。
下载代码后,上传到服务器,至于上传位置 只要能使用链接访问到即可,建议在插件的多说下新建立个 proxy 文件夹放这几个文件。编辑embed.php文件,大约在12和13行,修改成自己对应的网址,和文件传到的路径。
$data = str_replace("e.avatar_url","'https://你的域名/文件路径/img-cache.php?src='+e.avatar_url",$data); $data = str_replace("nt.data.default_avatar_url","'https://你的域名/文件路径/img-cache.php?src='+nt.data.default_avatar_url",$data);
进入多说插件目录,找到 Wordpress.php 编辑该文件,寻找 embed.js ,大约在600行前后。将其全部替换成 https 的刚才上传的路径中的文件的 url 然后如果有使用CDN的,去CDN刷新一下全站的缓存。
完成这些,就多说就也能实现全部走 https 协议了,至于多说评论的表情直接禁用即可,反正基本用不到。
将 http 请求跳转到 https
最后就是在配置文件写个301跳转,将博客的http请求全部跳到https,这个和收录有关系,一定要注意!
在对应的vhost文件的开头加上如下代码,记得把域名改了,别直接吧“你的域名”丢进去。
server { listen 80; server_name 你的域名; return 301 https://$server_name$request_uri; }
把原来的 listen 80 那一行删掉,然后再重启下Nginx。在试下是不是访问 http 就会自动跳转到 https了呢
至此,教程结束 。
文章评论
现在用certbot方便很多了,nginx的话还有certbot版本,nginx 1.9.5以上非源码编译安装版本直接修改配置就可以开启HTTP2了
@boyizmen 说到http2,用了CDN不支持http2,挺惆怅的...
@yingfeng verycloud 支持http2,这可不是杂牌军哦,cnbeta用了好多年了。我的博客也在用,你可以试试速度。
@笛声 我在用360的CDN 23333 懒啊
@yingfeng 我也是360的~~
@龙笑天 360的免费CDN还行,就是有时候会抽风。。。
你好哥们,我的网站用的阿里云的SSL证书,通过CDN也安装完毕启用https模式,刚开始网站后台是没有样式,我在后台把网站基本信息里的域名改成https://weixing.me提交之后就,后台就直接打不开了,请问这个怎么处理啊,搞了好久了,还是不行,谢谢!!
@魏星博客 我看你的后台跳转了好多次,你试试继续按照我教程中的,把数据库中是http改成https,当然,在这之前记得备份啊
很有借鉴意义。感谢站长
貌似沃通的最近出问题蛮多啊
@菊部 Wosign纯粹是自作自受,话说我还是没有换 = = 懒癌晚期
现如今,并不推荐使用WoSign的证书,也就是说StartCom也别用。具体可以搜索下Mozilla和Wosign。
@Benny 我知道,一直准备换,然而懒癌发作 。。。
@yingfeng 快换吧,非常简单容易的!
@Benny 换下文件,稍微改下配置,是很快 。。。
@yingfeng 是的!就是用Let's Encrypt签发下,然后改证书私钥的路径...
看着你们一个个都https,我在想我要不要也换一下……
@慕若曦 折腾了一下邮件回复提醒,不知道用手机的WordPress客户端回复可不可以。。
然而我的网站并没有变慢
@EQ https 确实会慢一点,毕竟还要第三方验证,然后,我用三六蛋的CDN,最近三六蛋的SSL似乎一直在抽风 ...
@yingfeng 不用CDN的路过
@EQ 不用CDN,一旦被ddos得炸呀
@zh 你是知道的,我已经炸过好几次了😭
@yingfeng 可以找找支持ssl,http2的cdn
@zh 有倒是有 是国内的不敢用 国外的cloudflare倒是支持。但是CDN 的IP容易被墙还是算了把。现在也蛮好的。一被D就换vps。。。
为什么没有Apache的教程?
@guozixi 因为我用的Nginx啊
好麻烦的说...
@一只北极熊 所以我才拖了这么久才弄的