2016年11月23日星期三

WordPress多域名绑定及HTTPS支持

当有多个域名想要绑定的同一个WordPress上时,可在根目录的wp-config.php中添加以下两行:

define('WP_SITEURL', (isset($_SERVER['HTTPS'])?'https://':'http://').$_SERVER['HTTP_HOST']);
define('WP_HOME', (isset($_SERVER['HTTPS'])?'https://':'http://').$_SERVER['HTTP_HOST']);
注意:需放在 require_once(ABSPATH . 'wp-settings.php'); 之前。

不过,如果通过反向代理访问时,根据$_SERVER['HTTPS']判断就会出问题。例如,原始博客地址是http://abc.com,用https://def.com反向代理原始博客,那么通过https://def.com访问时,$_SERVER['HTTPS']是未设置值的(unset);此时可通过$_SERVER['HTTP_X_FORWARDED_PROTO']来判断。
$_SERVER['HTTPS'] = isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https' ? 'on' : 'off';
define('WP_SITEURL', ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST']);
define('WP_HOME', ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST']);
注意:同样需放在 require_once(ABSPATH . 'wp-settings.php'); 之前。

使用Cloudflare代理加速时,这个问题复杂一些,如果Crypto中SSL设置为Full,则用上面方法通过$_SERVER['HTTP_X_FORWARDED_PROTO']判断即可;但是,如果SSL设置为Flexible时,$_SERVER['HTTP_X_FORWARDED_PROTO']的值可能为http而不是https,此时要通过$_SERVER['HTTP_CF_VISITOR']判断,其值为{"scheme":"https"}
$_SERVER['HTTPS'] = (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') || (isset($_SERVER['HTTP_CF_VISITOR']) && strpos($_SERVER['HTTP_CF_VISITOR'], 'https') !== false) ? 'on' : 'off';
define('WP_SITEURL', ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST']);
define('WP_HOME', ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST']);
重要事情说三遍:需放在 require_once(ABSPATH . 'wp-settings.php'); 之前。

较新的博文 较早的博文 主页