借助腾讯云 CDN 开启全站 https 及问题解决分享

自从百度推荐全站 https 以来,一直就想让博客跟上这个节奏。可惜,国内所有的免费CDN都不支持https。所以要开启https势必要暴露网站真实ip,按照博客现在被攻击的节奏,估计一暴露就没有了安生的日子!

偶尔的心血来潮,百度了一把支持https的CDN,打开了腾讯云的一个Q&A:

1.3 CDN 支持 https 吗?

https 目前处在邀请测试阶段,暂时还不提供申请,还请谅解。我们正在完善此特性,一旦产品成熟,我们会第一时间公布,敬请期待。

呵呵,邀请测试是么?既然是自家的产品,那还是毛遂自荐吧!

于是找到了公司腾讯云的产品经理,说了我这个想法,于是有幸就用上了国内这个为数不多的特权。

虽然,走的是后门,但是测试责任还是得尽好才是,因此也和产品经理没少交流。博客全面https化也遇到了非常多的问题,下面就让我来细细道来。

一、http回源

腾讯云CDN默认是http回源,这样就有一个问题:因为我们要全站https,不想有http, 那么势必需要将http的请求301到https上。这时腾讯云通过http过来请求源站,那么请求到的就是301了!这也是前些天博客时不时来一个502的原因了。大部分请求对301的支持不是很完善。。。

刚开始还无法自行设置回源模式,还好我用上不久,就发布了新版本,支持回源选择。妥妥的选择了https回源。然后静态文件我没有做强制https,因此静态文件我选择http回源,略微优化一下负载。

二、微信公众号

如上设置之后,又发现了一个新问题,微信粉丝跟我反馈,公众号不能自动回复了!

检查了下,原来是因为公众号只支持http模式的token请求,因此微信公众号的http请求得到的也是301结果,导致自动回复失败!

看来全部跳到https也是行不通的。测试了半天,最后用如下nginx规则搞定:

server{
   listen 80;
   server_name zhangge.net;
   root /home/wwwroot/zhangge.net;
   location / {
        #如果是post请求就交给 index.php,从而支持微信公众号自动回复
        if ( $request_method = POST ) 
        {
              rewrite ^/(.*)$ /index.php?$1 last;
              break;
        }
        #如果是Get请求,则301到https站点
        if ( $request_method = GET )
        {
              rewrite (.*) https://zhangge.net$1 permanent;
        }
        #其他任何请求,都301到https站点,这是补刀
        rewrite (.*) https://zhangge.net$1 permanent;
        }
        #php动态请求交给php-cgi
        location ~ [^/]\.php(/|$)
        {
             try_files $uri =404;
             fastcgi_pass  unix:/dev/shm/php-cgi.sock;
             fastcgi_index index.php;
             include fastcgi.conf;
        }
}

三、http被缓存

虽然CDN对301的缓存支持不好,但是不代表不能缓存301!因此,腾讯云CDN偶尔会缓存网站的http结果,导致强制跳转https失效!结果就是访问http页面也不会自动跳转了。

而现在腾讯云还不支持在节点直接设置强制https跳转,实在没办法,在网页的header里面加入如下js代码搞定这个问题:

<!-- 如果检测到是http页面,则自动跳转到对应的https页面 -->
<script type="text/javascript">
if (document.location.protocol != "https:") { 
        location.href = location.href.replace(/^http:/,"https:");
}
</script>

四.各种跳转

https之后,发现以前的文章外链自动跳转出问题了,把文章中的内链也当成了外链!而且评论中我自己的链接也变成了跳转。

看了下,原来是之前的函数并没有兼容https,于是改了下,搞定。

//文章外链跳转支持https
add_filter('the_content','link_jump',999);
function link_jump($content){
    preg_match_all('/<a(.*?)href="(.*?)"(.*?)>/',$content,$matches);
    if($matches){
	foreach($matches[2] as $val){
            if(strpos($val,'://')!==false && strpos($val,COOKIE_DOMAIN)===false && !preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i',$val) && !preg_match('/(ed2k|thunder|Flashget|flashget|qqdl|qqbrowser):\/\//i',$val)){
	    $content=str_replace("href=\"$val\"", "href=\"https://zhangge.net/go/?url=$val\" ",$content);
	    }
	}
    }
    return $content;
}

//评论者链接跳转支持https
function commentauthor_diy($comment_ID = 0) {
    $url    = get_comment_author_url( $comment_ID );
    $author = get_comment_author( $comment_ID );
    if ( empty( $url ) || 'http://' == $url ) {
	echo $author;
    } else {
        if (!preg_match('/http(s|):\/\/zhangge\.net/i',$url)) {
            echo "<a href='https://zhangge.net/go/?url=$url' rel='external nofollow' target='_blank' class='url'>$author</a>";
        } else {
            echo "<a href='$url' target='_blank' class='url'>$author</a>";
        }
    }	
} 

五.外部资源

众所周知,要全站https,那么所有页面都不能存在非https资源,否则浏览器就会拦截这些内容,并显示惊叹号!

于是大把的问题迎面而来:

1.百度分享不支持https

这个问题最终我用最苦逼的方法解决了,那就是将百度分享代码中的js,已经js会请求到的其他js/css资源全部都下载到本地(具体会请求到哪些资源,我都是在浏览器开发者模式中获取的),并修改其中的链接指向到本地,搞定了百度分享的大部分功能。

比如,分享到QQ空间、微博,分享到微信显示二维码都搞定了,唯独那个“更多”选择恕我无能为力:

最后,我将修改好的文件上传到支持https的七牛CDN,所以有需要的人可以将百度的分享链接修改如下,即可使用:

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"1","bdSize":"16"},"share":{"bdSize":16}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='https://dn-zgboke.qbox.me/static/bdshare.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

说白了,就是将之前的百度分享代码中的js修改为我提供的js即可:

代码地址:https://dn-zgboke.qbox.me/static/bdshare.js

如此解决之后,浏览器https就是绿色了,不会有黄色的惊叹号,不过如果你点击分享,依然会请求到非https的百度分享api,这时候会出现黄色惊叹号,恕我无能为力了,但不影响使用!

2.新浪微博关注按钮

好吧,这个问题我暂时没时间处理,直接屏蔽了这个功能,估计参考上面的方法可以解决。

六、整理总结

全站https已有3天,总体还是不错的!不过,腾讯云CDN的https功能目前还在邀请测试阶段,所以想尝鲜的小伙伴就只能耐心等待正式公测了。相信这个国内唯一支持https的CDN会大受欢迎的!

不知不觉已经写了这么长了!暂时就整理这么多,后续有新的问题再更新到这篇文章当中,敬请期待!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发者

非 SDK 接口常见问题 | Android 开发者 FAQ Vol.13

3093
来自专栏Flutter入门到实战

开发工具总结(9)之开源项目的README文档的最全最规范写法

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/813b70d5b0de

601
来自专栏Timhbw博客

分享一些HTML5的模板

2016-05-2923:14:33 发表评论 639℃热度 前几天看到一个HTML5 UP的网站,发现国内许多网站都用的他的模板做的首页,的确非常适合,高端...

2997
来自专栏BestSDK

一个简单登录页面就能看出你的设计功底,不信?|来试试

一个合格的注册登录页面,应该是具有清晰的操作流程,良好的交互细节和美观的视觉设计。 清晰的操作流程 APP的注册登录有四种情况: 不需要注册登录 常见于系统自带...

3656
来自专栏冰霜之地

Vue 全家桶 + Electron 开发的一个跨三端的应用

我是一名全职的 iOS 开发者,非前端开发者。由于接触了 Weex 开发,从而接触到了 Vue.js。

1907
来自专栏鹅厂优文

开发效率太低?您可能没看这篇文章

还记得刚参加工作的时候, 有位开发的同事软件使用效率奇高. 我曾亲眼目睹他在几秒之内打开开发软件, 优雅地调出隐藏的功能, 输入数据输出结果的过程行云流水, 一...

5692
来自专栏云计算D1net

如何应对Heartbleed安全漏洞

? 本周早些时候,一个名为Heartbleed的大型安全漏洞浮出水面。该漏洞可让入侵者诱使服务器泄漏你的个人数据。 Heartbleed漏洞的危险性...

2625
来自专栏程序员的知识天地

10 款最好的 Python 开发编辑器

Python 非常易学,强大的编程语言。Python 包括高效高级的数据结构,提供简单且高效的面向对象编程。

631
来自专栏DeveWork

JGulp: 利用Gulp 配置的前端项目自动化工作流

商业竞争时代的Web 开发,效率越来越成为其中决胜的关键因素之一。在前几年的时候,前端是一片荒芜的待开垦之地,开发者更多考虑开阔更多技术疆域;而最近几年,在前端...

18710
来自专栏FreeBuf

如何用kwetza给安卓应用加后门

*本文仅供安全学习、测试或信息安全教学用途,禁止非法使用 简介 这篇文章将会描述一种在Android可执行文件中种后门的方法。在接下来的动手操作部分,我将使用到...

2419

扫码关注云+社区