WordPress 开启全站 HTTPS

自从 CNNIC 颁发的子证书发生了中间人攻击这些事件之后,SSL 连接以及 HTTPS 变得越来越流行了。这时候我们从“使用 SSL 保护你的登录信息以及后台页面”变成了推荐“SSL Everywhere”,使用全局 SSL 加密,有效避免用户在访问网页的时候造成隐私的泄露。而且,根据谷歌站长的最新教程当中的介绍表示,使用 https 对 SEO 更有好处(国内就别想了,但谷歌的爬虫真的会更看重 Https 网站。)另外,升级到 Https,也不需要在谷歌站长工具里做什么——支持平滑升级,唯一的缺点恐怕是收录会波动一小段时间。

谷歌支持到 HTTPS 的平滑迁移
谷歌支持到 HTTPS 的平滑迁移

这里,我们要感谢 StartSSL™ ,如果不是他们,恐怕我们这些微小站长个人博客博主就无缘 SSL 了。

由于这个原因,落格不在使用 StartSSL 的免费证书了,而是转而使用备受关注的 Let’s Encrypt 项目,这样你可以很方便地获得个人免费证书。不过,如果你和我一样是把博客扔在虚拟主机,那我想你可能需要这个网站以支持虚拟主机的 cPanel 等后台配置。

对于如何申请证书这个问题,这里暂时略过不讲,总之这篇文章假定你至少拥有了一个有效签名的证书以及对应的域名。

关于 HTTPS 的那点不得不讲的事情

HTTPS 使用443端口来验证你的链接,通过 SSL、TLS 这种低层的加密技术来保证你的连接是安全的,由于 SSL 这种协议在 IP 层面上,所以建立安全握手的时候甚至还没有发生 HTTP 数据的交换,这就导致了 SSL 这个本身针对域名进行签名的证书却需求你有一个独立的 IP 地址。不过,现实很快就无情地证明——IPv4 地址终究会被用尽。虚拟主机应运而生,这时候我们很庆幸的还能有一个独立的域名和空间,但 IP 地址却是共享的

Web 服务器通过区分来自不同域名的请求来在同一 IP 的同一端口上提供不同的网站服务,这就导致了一个严重的问题:“SSL 证书绑定给谁?”事实上虚拟主机确实很难支持 SSL,一不小心就会导致同 IP 下的其他域名提示证书不正确。不过,现如今的主流浏览器都支持了一个新的协议:SNI

使用 SNI,将允许 Web 服务器在同一 IP 上单独为每一个域名提供证书。

所以说,如果你想要在一个 IP 上绑定多个域名的证书,或者说你依旧使用着经济实惠的虚拟主机,想要绑定证书,那么就需要确定你的主机可以支持 SNI——当然了,目前主流的服务器比如 NginxApache 等都已经支持,唯独要点名的是 IIS 貌似还是不支持的。

至于浏览器,Safari、Chrome、Firefox 等知名浏览器都已经支持,要点名的是 IE 系列貌似 5678 都不太好使。

好了,扒完了背景,我们正式开始操作:

由于落格依旧是虚拟主机配置,这里我们讲如何用 cPanel 来开启 SSL:

一、开启 SSL 访问支持

登录你的 cPanel,如果你的虚拟主机支持 SNI 技术(就看服务商给不给力了),那么你应该可以在 cPanel 面板中的“安全”分类里边找到“SSL/TLS”功能按钮。

“安全”分类里的“SSL/TLS”
“安全”分类里的“SSL/TLS”

点击进入之后你就会看到上传私钥公钥以及绑定域名的链接,依次进入上传之,然后选择去绑定链接里绑定自己的域名“www”即可。(这里要注意,如果你和落格一样使用的是一类证书,那么你应该没有资格签泛域名证书,裸域应该也是不行的。)

绑定之后,你的博客应该就已经能够使用 Https 来访问了,不过,这才刚刚开始。

二、开启访问 HTTPS 301重定向

细心的你这时候一定会发现,你的网站这时候虽然支持了 HTTPS 访问,但是似乎也可以使用 HTTP 来访问,考虑到搜索引擎目前收录的都是你的 HTTP 链接,那么如果不做点什么的话恐怕这张 SSL 证书将会毫无用处!

我希望你的空间能够支持 .htaccess ,如果你的博客开启了伪静态的话,那八成你的空间是支持的。 :)

我们使用 .htaccess  文件来添加一个301重定向(其实还有其他各种迁移的办法,但是谷歌大爷官方推荐使用301重定向)将所有的 HTTP 流量使用301重定向到 HTTPS 上边去,当然,这样还有一个潜在的问题:国内百度等搜索引擎的爬虫不支持 HTTPS

我很好奇,为什么在全世界都提倡 SSL Everywhere 的情况下,我国国内的互联网环境还是“明文走天下”,当然,这可能也跟那个“Girl Friend Wall”有关系吧……(不然不好和谐了啊~)所以,我们还要单独为国内的一些搜索引擎的爬虫定制一下规则,如果检测到他们的 UA,那么就允许他们访问 HTTP 流量。

在你博客空间的 www  目录(有的可能是 public_html )下,找到 .htaccess 文件,编辑它,在里边填入下列代码:

对了,考虑到巨硬的 IE 大爷,我们把12345678都排除在外,让它们妥妥的滚去访问 HTTP 吧,省的各种警告烦心。

三、开启登录和后台的强制 SSL

虽然有了整站的重定向,但我们不妨还是将 WordPress 本身自带的功能打开,以期更完善的兼容体验——毕竟是301重定向。

还是找到你网站根目录里边,这次要修改的文件是 config.php,直接在这个文件的末尾另起一行,追加两行代码:

四、站内链接支持

最主要的可能就是图片的问题了,你在上传到空间的附件都被 WordPress 标记为了绝对链接,而且全都妥妥的写入了 “http://”。一般来讲,是需要用数据库替换的,不过这种方法有点小危险,我这里给你推荐另外一个不错的选择:使用代码让 WordPress 在加载附件之前将链接替换就好了!——毕竟,只是协议的问题,跟路径没有半毛钱的关系~

(我希望你使用了 WordPress 的子主题功能……)

找到当前主题下的 function.php 文件,编辑之,在里边代码的末尾追加如下代码:

另外,除了这个大头意外,你还需要关心站内的各种内链:

  • 修改“菜单”当中的所有“自定义链接”为相对路径;
  • 修改“设置”→“常规”里的“站点地址”和“WordPress 地址”为 HTTPS;
  • 修改其他自己手贱写入的绝对链接地址……

五、关心一下插件

现在,还剩下最后一个问题:插件的兼容性

是的没错!并不是所有的插件都会兼容 SSL!(尤其是国内的插件)

对了!关于 CNZZ 这个统计的话你只需要改动一下统计代码就可以,将 HTTP 修改为 HTTPS 即可。不过国内比较常用的 JiaThis 社会化分享插件就无力了,只能割爱停删

另外,曾今“我爱水煮鱼”开发的相关文章插件:WordPress Related Post,后来卖给了老外,总是会加载一个站外的链接,如今还因为 Girl Friend Wall 的问题导致这个 js 脚本各种菊花,只好果断停删

你可以使用任意浏览器,打开你的博客页面之后随便打开一篇文章,选择类似于“检查元素”的操作,查看报错就可以了:要求是没有任何红色的错误,黄色的警告“⚠️”可以忽略。

关于删除的插件那功能怎么办?

当然是找替换插件了,这里针对如上的两个插件,路由推荐两个插件:

  • anyShare 它是一个功能简洁十分轻量级的社会化分享插件,按钮比较大(你可以稍后在这片文章末尾看到样式),虽然说它已经10个月没有更新,但我向你保证这玩意儿绝对兼容最新版本的 WordPress 并且功能完美。:)
  • Yet Another Related Posts Plugin 这个是另外一个相关文章插件,再也没有烦人的站外链接了,免费版功能足够,而且同样支持RSS,而且现在它的配置界面也不再那么让人望而生畏,对了!虽然它同样被提示不兼容最新版——但我保证,这玩意儿同样功能正常~

最后,你可以到这个页面来参考落格都使用了哪些狂拽炫酷吊的 WordPress 插件,这些插件至少都会兼容 SSL

 


 

这下,你的博客应该已经能够完美的显示出一个灰色的小锁啦!

唉?!为什么是灰色?知足吧,一类证书都是酱紫,想要绿色掏钱

对了,在 Chrome 下是绿色了,但 Safari 比较挑,是灰色的~

另:如果你的博客包含了同域名下的非 HTTPS 链接,Chrome 会出现黄色的三角警告,而 Safari 则是像普通链接一样不在地址栏里显示小锁

“WordPress 开启全站 HTTPS”的66个回复

    1. 可以的!直接撸数据库有风险,相对来说动态改链接则更方便一些(比如某天不用ssl了(虽然可能性不大……
      总之,有能力的话直接替换了也是可以哒,还更方便性能也好。

  1. 看完了博主写的很详细,anyShare这个插件我感觉没有百度分享好用,只需要一段代码不需要插件就能搞定。我也准备给博客加上https啊,沃通和Let’s Encrypt 两家的免费ssl谁家的好呢?

  2. 大佬请教个问题,

    我已开启绿锁,但是如果友情连接的人不是HTTPS的时候,这个页面就会显示灰色,提示有非法的HTTP资源,这个连接不是本站的的连接,也不是图片 JS 什么资源,就一纯连接。怎么办?

    1. 是这样的,如果你的网站是https,而里边提供了http链接,那么浏览器会认为你的页面是不安全的。一种办法是都提供https,另一种嘛就是去掉了。或者不管他。

  3. 使用的七牛插件,使用https后,缩图还是本地图片,而且是http的,怎么处理?

    /* 替换图片链接为 https */
    function my_content_manipulator($content){
    if( is_ssl() ){
    $content = str_replace(‘http://www.logcg.com/wp-content/uploads’, ‘https://www.logcg.com/wp-content/uploads’, $content);
    }
    return $content;
    }
    add_filter(‘the_content’, ‘my_content_manipulator’);
    这个替换不掉缩图的图片

    1. 一般来说这是个趋势,现在各种一键脚本很多,甚至我的服务商都为空间用户提供了一键部署功能!

      但要注意选择合适的厂商到了签发证书,比如 let’s encrypt 就不错,或者其他便宜的免费的厂商,但注意不要使用 startssl 和 wosign 沃通,这两家臭名远扬。

  4. Safari的策略是只针对EV显示绿色,以及绿色小锁旁边还有公司名称。
    有绿色显示公司名称是EV证书的特权,ch也会用绿条显示名称。只不过ch在网页中没加载http资源时都是绿锁

    1. 是的,ev证书太贵了,所以说难以获得。普通证书自然就是灰色小锁,而其他浏览器就很给面子,是锁就绿色了。至于你说的ch…………我真不知那是什么啊………………

    1. “由于这个原因,落格不在使用 StartSSL 的免费证书了,而是转而使用备受关注的 Let’s Encrypt 项目,这样你可以很方便地获得个人免费证书。不过,如果你和我一样是把博客扔在虚拟主机,那我想你可能需要这个网站以支持虚拟主机的 cPanel 等后台配置。” 我确实更新了的:)

          1. 1 我这是vps本来就是便宜货所以没面板的,amh是自己装的QAQ 其次….我是学生忙+懒癌=需要自动续签…所以我花了一上午弄那玩意….问人家官方不愿意弄模块说这玩意还是手动弄好….成果都是逼出来的QwQ我委屈,但我不说..

  5. 我网站很多插件对https不支持,所以想弄https强制跳转到http的,是不是也可以Rewrite方式逆思维处理?>还有是不是删除
    RewriteCond %{HTTP_USER_AGENT} !MSIE/[1-8]\. [NC]
    这行的话就会让IE大爷的全系列也遵守规则?谢谢~
    ps:本来打算全站用https的所以特地为了绿锁头和信息展示买了ssl,现在才发现…无卵用= =真别买

    1. 哈哈哈~~确实,我们个人用户的话买ssl证书没什么用,我现在使用免费的encrypt everywhere,只要三个月一更新即可。如果你要反过来跳转……请不写规则即可。因为浏览器默认会走http,如果非要如此……确实可以按照你说的,反过来些rewrite……
      但我觉得吧,就默认就好啦。

      最后,能https,还是https,这样是对读者负责。

      1. https固然好,可是插件什么都不支持啥也加载不出来红叉一堆…脑袋大啦
        而且以前没改站点的时候一直用的https,但是现在用https访问的话会出错所以想强制跳转到http这样的话照顾下加收藏夹的……
        (论自己修改插件能力的重要性…)

        1. 对于插件,我的态度是换而不是改,不是改不了而是人家要升级。你辛辛苦苦改了,回头人家升级了全完了。换一个支持https的同功能插件是很容易的事情啊。
          不过要是懒得调试,那就http吧~只是没有小绿锁,看着心慌慌呢:)

          1. QAQ问题是有些插件并不是满街是遍地有的程度..默契度难得的高了再改就麻烦很多了….
            插件的话我已经有过一次教训了所以基本上顺手的…不升级…
            至于绿锁头?ps一个不就好了╮(╯▽╰)╭(开玩笑)
            但是现在想想还是有个锁头更好点….嗯….得熬夜赶工了
            然后问一下Let’s Encrypt Authority X1 和Let’s Encrypt Authority X3有区别吗….

          2. 1234有各自不同的用途,比如4号是作为灾备的,平时不适用。12是前面几代的证书,也不应该使用,不过如果你要兼容xp,那就需要使用x1;平常使用的话,就是用3.

    1. 我发现你好像使用了七牛的cdn来给博客加速了,那么你需要去七牛的配置页面获取https链接而不是普通的http链接。要使用七牛的https链接,你可能需要保持你的七牛账户余额大于10元并且进行实名认证:)

    1. 我删了是因为这东西对落格来说用处不是太大,依照落格目前的访问量来看,开了也就是占用点内存罢了~哪里需要那么大的并发?有个静态缓存足矣。

      1. # BEGIN WordPress

        RewriteEngine On
        #RewriteCond %{HTTPS} !^on$ [NC]
        #RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
        RewriteBase /
        RewriteRule ^index\.php$ – [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]

        # END WordPress
        规则如上,但是访问不了,阿里云的虚拟主机,请问博主有遇见过这个问题么?

  6. 我用了沃通的证书,现在全部页面都是hppts的,但是输入网址自动访问的是hppt,要点下logo才会回到hppts,而且hppt登陆就是没反应转到hppts才会是登陆状态 。。。。有什么方法解决吗,我百度几天了没一个教程

发表评论

电子邮件地址不会被公开。 必填项已用*标注

69 − = 60