CDN全站加速wordpress开启HTTPS并使用http回源

事件背景

我的小站几个月前就开始了全站https,一直没有使用CDN,后来百度CDN和腾讯CDN做活动,就分别开通了CDN服务。

基本上百度CDN和腾讯CDN的配置很像,而且有详细的文档,怎么接入CDN我就不多说了。这里主要说下,我们上传https证书到CDN服务后,在回源方式上可以选择HTTP回源和HTTPS回源,开始为了方便,因为本站已经全站HTTPS了嘛,就选择了HTTPS回源。分别试了下百度云CDN和腾讯云CDN,感觉都不错,就选择了百度云CDN加速。然后无事随便看了下百度云CDN的文档,关于HTTP回源及HTTPS回源的介绍。顾名思义,HTTP回源的时候,CDN使用HTTP协议回源,HTTPS回源,需要主机端开启HTTPS端口,并部署证书。显然,既然CDN端开启了强制HTTPS ,回源的时候,使用HTTP回源,效率更高点。切换成HTTP回源后,问题就来了,大量的 js 文件和 css文件都没有使用https加载,浏览器的小绿锁也没了,页面布局一塌糊涂。

https

问题定位

程序猿的直觉告诉我,这不是CDN配置有问题,应该是wordpress加载资源的时候有问题,因为在检查页面的时候,里面的所有资源都使用了完整路径, 而不是相对路径,应该是回源的时候,wordpress 对请求的协议做了判断,进过一番调试,发现在加载header及静态资源时,使用了 is_ssl 方法,见:/wp-includes/functions.php 中的 is_ssl()方法

/**
 * Determine if SSL is used.
 *
 * @since 2.6.0
 *
 * @return bool True if SSL, false if not used.
 */
function is_ssl() {
   if ( isset($_SERVER['HTTPS']) ) {
      if ( 'on' == strtolower($_SERVER['HTTPS']) )
         return true;
      if ( '1' == $_SERVER['HTTPS'] )
         return true;
   } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
      return true;
   }
   return false;
}

解决办法

知道了原因 ,解决方案就出来了,在wp-config.php 中,加入下面一段代码就OK了:

<?php
/**
 * WordPress基础配置文件。
 *
 * 本文件包含以下配置选项:MySQL设置、数据库表名前缀、密钥、
 * WordPress语言设定以及ABSPATH。如需更多信息,请访问
 * {@link http://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
 * 编辑wp-config.php}Codex页面。MySQL设置具体信息请咨询您的空间提供商。
 *
 * 这个文件被安装程序用于自动生成wp-config.php配置文件,
 * 您可以手动复制这个文件,并重命名为“wp-config.php”,然后填入相关信息。
 *
 * @package WordPress
 */
//https 配置
 
$current_sitename= $_SERVER['HTTP_HOST'];
if ($current_sitename == 'www.appdays.cn') {
     $_SERVER['HTTPS']='on';
}

然后保存配置文件,刷新浏览器,问题解决。