WordPress 迁移至 https 的正确办法

虽然我一向认为在公开的静态内容上使用加密没有必要,然而大公司,尤其 google,非常不厚道地在所有 http 站点上标记 “不安全”,其心可诛也。

作为 fallback,我会继续保留 http 的访问,不会强制跳转。

首先还是要继续旗帜鲜明地说明一件事情,http 作为一个明文传输的协议,允许所有中间人监视和修改传输的内容,这是设计的缺陷,但显然不是 “不安全” 的充分条件。对于单向传播公开信息的站点来说,比如说这个博客,http 的最大风险可能是用户看到被修改的信息,比如说运营商的劫持广告,或者有人在中间插入挖矿脚本。不过对于一个正确设计的浏览器来说,这些风险算不上 “不安全”。

wordpress 切换到 https 的方法和任何站点都差不多,首先需要找 CA 签发一个证书,然后配置服务端程序。这部分非常简单,没什么值得注意的问题。

为了避免出现 mixed content,需要修改 wordpress 的设置数据库。可以在管理界面 Settings – General 中直接修改 Home 和 Site URL 为 https,也可以在 cli 直接修改,比如

> use [wordpress db];
> SELECT * from wp_options WHERE option_name = 'home' OR option_name = 'siteurl';
> UPDATE wp_options SET option_value = 'https://example.com' WHERE option_name = 'home' OR option_name = 'siteurl';

更简单的办法是直接在 wp-config.php 里直接加入

define('WP_HOME','https://zzi.io');
define('WP_SITEURL','https://zzi.io');

这样就配置完了。

如果使用的是 apache2,有时候因为 wordpress 不能正确识别传递过来的 flag,会无限重定向 (浏览器提示 too many redirects),可以在 wp-config.php 手动指定

$_SERVER['HTTPS'] = 'on';
define('RELOCATE',TRUE);

最后,应该检查 wp-config.php 是否包含一行

define('FORCE_SSL_ADMIN', true);

这行设置保证 admin 只能通过 ssl 登录和管理,默认情况下应该是打开的。

最后说点闲话,博客很久以来没有加入 https 其实是习惯问题,如果不是非常必要,我一般不会做改动。https 对于目前的一般网络和设备已经不会造成任何性能损失,所以加上是不会有任何危害的。

在使用 nginx 的站点上,可以做一些新的更新。以下是我们的内部网站上用的配置

brotli

首先编译 libbrotli,在编译 nginx 时加入 –add-module=../ngx_brotli,最后在nginx.conf 中加入这些设置

brotli             on;
brotli_comp_level  6;
brotli_types       text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

http2

在站点配置文件中加入

listen    443 ssl http2 fastopen=3 reuseport;

当然,编译 nginx 的时候需要加入 –with-http_v2_module

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.