yingfeng
心明若鏡,不將不迎

在VPS上实现WordPress全站https

前不久我给自己的博客开启了全站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证书免费两年,到期可以免费续期,相当于完全免费。Wordpress 启用全站https教程_协议

官网详细介绍

以沃通免费证书为栗子例子,先到对应的网站申请证书Wordpress 启用全站https教程_申请

取得证书后,将其解压,根据你的服务器环境选择对应的文件解压,上传到服务器上,位置自己选择

Wordpress 启用全站https教程_解压

需要注意的是,上传上去的是应该是俩个文件,一个是公钥,一个是私钥。以Nginx为例,应该是一个.key后缀的文件和一个.crt后缀的文件
Wordpress 启用全站https教程_上传到服务器

然后便是要修改对应的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

Wordpress 启用全站https教程_后台改地址

改完这个文章什么的连接就自动改成https了,但是还有个很严重的问题,就是图片,当初你发文章插入图片的时候Wordpress可是在数据库妥妥的给你写入了“http://”这个有两种解决方法。

第一种:修改数据库

如果你要采用第一种方法,建议还改之前先去主机商那边创建一个快照,就是备份一下。

进入 phpMyAdmin,打开 WordPress 的 wp_posts 表,搜索,查找与替换(Find and replace)

Wordpress 启用全站https教程_数据库_查找

这里以我的博客 yingfeng.me 为例,搜索 http://yingfeng.me 替换为 https://yingfeng.me 字段选第一个 post_content 点击执行

Wordpress 启用全站https教程_数据库_替换

第二种:修改主题

找到当前主题的 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了呢

至此,教程结束 。

本文发布于:yingfeng Blog>>在VPS上实现WordPress全站https,转载请注明出处。

评论 29

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #0

    现在用certbot方便很多了,nginx的话还有certbot版本,nginx 1.9.5以上非源码编译安装版本直接修改配置就可以开启HTTP2了

    boyizmen6年前 (2017-12-03)回复
    • 说到http2,用了CDN不支持http2,挺惆怅的…

      yingfeng6年前 (2017-12-03)回复
      • verycloud 支持http2,这可不是杂牌军哦,cnbeta用了好多年了。我的博客也在用,你可以试试速度。

        笛声6年前 (2017-12-07)回复
        • 我在用360的CDN 23333 懒啊

          yingfeng6年前 (2017-12-07)回复
          • 我也是360的~~

            龙笑天6年前 (2017-12-16)
          • 360的免费CDN还行,就是有时候会抽风。。。

            yingfeng6年前 (2017-12-16)
  2. #0

    你好哥们,我的网站用的阿里云的SSL证书,通过CDN也安装完毕启用https模式,刚开始网站后台是没有样式,我在后台把网站基本信息里的域名改成https://weixing.me提交之后就,后台就直接打不开了,请问这个怎么处理啊,搞了好久了,还是不行,谢谢!!

    魏星博客7年前 (2017-08-25)回复
    • 我看你的后台跳转了好多次,你试试继续按照我教程中的,把数据库中是http改成https,当然,在这之前记得备份啊

      yingfeng7年前 (2017-08-25)回复
  3. #0

    很有借鉴意义。感谢站长

    封麟网络7年前 (2016-12-10)回复
  4. #0

    貌似沃通的最近出问题蛮多啊

    菊部8年前 (2016-11-13)回复
    • Wosign纯粹是自作自受,话说我还是没有换 = = 懒癌晚期

      yingfeng8年前 (2016-11-14)回复
  5. #0

    现如今,并不推荐使用WoSign的证书,也就是说StartCom也别用。具体可以搜索下Mozilla和Wosign。

    Benny8年前 (2016-10-11)回复
    • 我知道,一直准备换,然而懒癌发作 。。。

      yingfeng8年前 (2016-10-11)回复
      • 快换吧,非常简单容易的!

        Benny8年前 (2016-10-11)回复
        • 换下文件,稍微改下配置,是很快 。。。

          yingfeng8年前 (2016-10-11)回复
          • 是的!就是用Let’s Encrypt签发下,然后改证书私钥的路径…

            Benny8年前 (2016-10-11)
  6. #0

    看着你们一个个都https,我在想我要不要也换一下……

    慕若曦8年前 (2016-10-03)回复
    • 折腾了一下邮件回复提醒,不知道用手机的WordPress客户端回复可不可以。。

      yingfeng8年前 (2016-10-07)回复
  7. #0

    然而我的网站并没有变慢

    EQ8年前 (2016-08-06)回复
    • https 确实会慢一点,毕竟还要第三方验证,然后,我用三六蛋的CDN,最近三六蛋的SSL似乎一直在抽风 …

      yingfeng8年前 (2016-08-06)回复
      • 不用CDN的路过

        EQ8年前 (2016-08-07)回复
        • 不用CDN,一旦被ddos得炸呀

          zh8年前 (2016-08-08)回复
          • 你是知道的,我已经炸过好几次了😭

            yingfeng8年前 (2016-08-08)
      • 可以找找支持ssl,http2的cdn

        zh8年前 (2016-08-08)回复
        • 有倒是有 是国内的不敢用 国外的cloudflare倒是支持。但是CDN 的IP容易被墙还是算了把。现在也蛮好的。一被D就换vps。。。

          EQ8年前 (2016-08-08)回复
  8. #0

    为什么没有Apache的教程?

    guozixi8年前 (2016-07-24)回复
  9. #0

    好麻烦的说…

    一只北极熊8年前 (2016-07-23)回复
    • 所以我才拖了这么久才弄的

      yingfeng8年前 (2016-07-23)回复