版权声明:本文由张戈原创文章,转载请注明出处:
文章原文连接:https://www.qcloud.com/community/article/78javascript
来源:腾云阁 https://www.qcloud.com/communityphp
自从百度推荐全站 https 以来,一直就想让博客跟上这个节奏。惋惜,国内全部的免费CDN都不支持https。因此要开启https势必要暴露网站真实ip,按照博客如今被攻击的节奏,估计一暴露就没有了安生的日子!
偶尔的心血来潮,百度了一把支持https的CDN,打开了腾讯云的一个Q&A:css
1.3 CDN支持https吗?
https目前处在邀请测试阶段,暂时还不提供申请,还请谅解。咱们正在完善此特性,一旦产品成熟,咱们会第一时间公布,敬请期待。java
呵呵,邀请测试是么?既然是自家的产品,那仍是毛遂自荐吧!
因而找到了公司腾讯云的产品经理,说了我这个想法,因而有幸就用上了国内这个为数很少的特权。
虽然,走的是后门,可是测试责任仍是得尽好才是,所以也和产品经理没少交流。博客全面https化也遇到了很是多的问题,下面就让我来细细道来。
nginx
腾讯云CDN默认是http回源,这样就有一个问题:由于咱们要全站https,不想有http, 那么势必须要将http的请求301到https上。这时腾讯云经过http过来请求源站,那么请求到的就是301了!这也是前些天博客时不时来一个502的缘由了。大部分请求对301的支持不是很完善。。。
刚开始还没法自行设置回源模式,还好我用上不久,就发布了新版本,支持回源选择。妥妥的选择了https回源。而后静态文件我没有作强制https,所以静态文件我选择http回源,略微优化一下负载。api
如上设置以后,又发现了一个新问题,微信粉丝跟我反馈,公众号不能自动回复了!
检查了下,原来是由于公众号只支持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; } }
虽然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资源,不然浏览器就会拦截这些内容,并显示惊叹号!
因而大把的问题迎面而来:app
这个问题最终我用最苦逼的方法解决了,那就是将百度分享代码中的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,这时候会出现黄色惊叹号,恕我无能为力了,但不影响使用!
好吧,这个问题我暂时没时间处理,直接屏蔽了这个功能,估计参考上面的方法能够解决。
全站https已有3天,整体仍是不错的!不过,腾讯云CDN的https功能目前还在邀请测试阶段,因此想尝鲜的小伙伴就只能耐心等待正式公测了。相信这个国内惟一支持https的CDN会大受欢迎的! 不知不觉已经写了这么长了!暂时就整理这么多,后续有新的问题再更新到这篇文章当中,敬请期待!