标签 SSL 下的文章

把一个wordpress网站源码重新上传,用了一个闲置域名,准备搭起来用来申请adsense,之前用了个随便复制粘贴了些文章的站申请了好几次,也刷了些流量,结果还是一直都过不了,想到还有这个站,整体看起来大概应该还可以,比那个复制粘贴的站好一些,所以准备上线刷上几天流量,再申请adsense试试。

这年月搭个站自然是要带上https的,所以就相当于是给wordpress的网站换域名并启用ssl了,直接进到到数据库改,先把wp_posts表里的旧域名都换成新域名

UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://old.com', 'https://new.com');
UPDATE wp_posts SET guid = REPLACE(guid, 'http://old.com', 'https://new.com');

再把wp_options表里的siteurl和home两个配置项换成新域名,其他的一些插件和主题配置项中也可能有域名,可以手工逐条查找修改,也可以直接sql一下修改,不过因为有些配置项是serialize序列化的,所以还是在phpmyadmin里手工修改好一些

UPDATE wp_options SET option_value = replace(option_value, 'http://old.com','https://new.com');

另外wp_comments,wp_postmeta表里可能也有旧域名,不过这些就按需修改了。

修改完成,打开新换的域名看看,结果,“此页面不能正确地重定向”,什么鬼,有缓存?还有没改到地方?不应该呀,明明能改的都改了,怎么会这样?

Cloudflare Flexible SSL导致WordPress开启https后无限循环重定向

又是一通查看,数据库,网站文件各种检查,结果还是一直无限循环重定向,前后台都是,都打不开,尴尬了,中间还一度以为是浏览器301缓存的原因,因为一开始没修改完,访问了一下新域名直接给301跳转到旧域名上,然后发现这个301缓存是永久的,不清除缓存的话,就算是取消301跳转,浏览器这边还是会直接跳转,当然也可以直接在F12的网络选项卡里选择禁用缓存。

各种尝试查找,都无果,想着这个重定向是在wordpress内部执行的,把重定向取消掉试试,在主题模板的functions.php文件里加上一行代码

remove_filter('template_redirect', 'redirect_canonical');

加上之后,确实可以访问了,不过js,css什么都没有加载,因为这些资源文件都还是http加载的,被浏览器默认禁用了,所以整个页面没有样式,难道是后台还有什么插件或者主题设置的不对,登陆后台试试,后台也是无限循环重定向,所以要把后台的重定向也取消掉,在wp-includes/functions.php文件里找到force_ssl_admin函数,直接在这个函数第一行加上return false

function force_ssl_admin( $force = null ) {
        return false;  // 加到这里      
        static $forced = false;

        if ( !is_null( $force ) ) {
                $old_forced = $forced;
                $forced = $force;
                return $old_forced;
        }

        return $forced;
}

然后后台也确实可以访问了,不过跟前台一样,也是没有样式,css跟js什么也都是http加载的,所以被浏览器默认禁用了,不过这时惊奇的发现,不带https,直接使用http访问后台时,竟然没问题,嗯,前台直接用http访问也是没有问题,这还真是好奇怪,emmm,难道是这套源码里还有什么不为人知的改动,正好wordpress版本也不是最新的,干脆直接升级到最新版本试试,然并卵,升级之后还是一样的问题,真是尴尬了,难道是缓存的问题?不过缓存是没有的,因为没有加缓存插件,配置什么的也应该都没有问题,这下应该不是wordpress哪里不对的问题了,那问题出在哪呢?奇怪emmm~

想来想去,试来试去,还是无果,这真是尴尬了,而且不应该呀,应该不是wordpress的问题,那是哪里的问题呢?会不会是cloudflare的问题?没错这个域名是放到cloudflare上的,我去,该不会真是cloudflare的问题吧,赶紧去看看,把cloudflare的缓存清掉,然无用,继续看,这个SSL: Flexible是个什么鬼,看看帮助

Flexible SSL: You cannot configure HTTPS support on your origin, even with a certificate that is not valid for your site. Visitors will be able to access your site over HTTPS, but connections to your origin will be made over HTTP.

所以这个Flexible SSL就是说,不需要源网站配置SSL证书,用户访问网站的时候使用https请求,而Cloudflare会直接向源站服务器发送http请求,也就是说,用户->https->cloudflare->http->源站,用户到Cloudflare这段是加密的https访问,Cloudflare到源站服务器这段是不加密的http请求,用这样的方式开启网站的https。

我勒个去,搞了半天,竟然是这样的,虽然是直接是使用https访问的网站,而且在wordpress里也都改成了https,但是实际上Cloudflare发到源站的请求是http的,而wordpress检测到是http的请求又会直接发送重定向到https的响应,然后再一次 https->http->https,然后...就陷入了一个无限循环重定向的死循环中,好吧,折腾这么久,结果是这么个原因,所以解决方法也就很简单了,直接把Cloudflare的SSL选项改成 Full 或者 Full(Strict),让Cloudflare默认访问https

Cloudflare Flexible SSL导致WordPress开启https后无限循环重定向

OK,问题解决,网站可以正常使用https访问了。