专栏首页张戈的专栏全站启用SSL之后,如何兼容不支持https抓取的搜索引擎?

全站启用SSL之后,如何兼容不支持https抓取的搜索引擎?

还是在今年 5 月份,百度就跳出来,宣布成为国内首个支持 https 的搜索引擎,结果呢?呵呵...

一、案例

①、抓取诊断

全站开启并强制 https 之后,在百度站长平台使用抓取诊断发现,其实百度并不会识别强制跳转的 301 状态,至少不会友好的反馈给用户:

抓取并没有出现跳转提示:

其实,后台日志显示是正常的 301 跳转:

②、真是打脸

2017 年 05 月 25 日更新:偶尔进入站长平台看了一把,居然给我博客自动做了 https 认证,然后去百度搜索 site 了一把我的网站,基本已全部换成了 https,看来百度对 https 的收录已全面展开!

百度发公告说,已全面支持 https,并推荐各个网站开启 https,得到优先展示,结果呢?

我们先百度 site 一下 www.baidu.com,然后复制收录里面的链接:

http://www.baidu.com/link?url=f3Fbk5cL6W_Hz0jtf6JY991vn1teNTzZ1WBHaqnOmCO&wd=&eqid=aab2bf1f0009872d000000055687e679

然后用网页内容抓取工具看下百度收录自己的是什么:

真是呵呵了,自己收录自己的也是 http,说好的 https 呢?你 5 月份就发公告支持了,这大半年了自己对自己的收录都没更新过来,何况其他网站??

其实,要看百度对自己的收录是否是 https 还有一种更简单的方法:直接在百度搜索 https://www.baidu.com 即可:

再次呵呵下。。。

③、配套设施缺憾

百度搜索确实是全站启用了 https,可你的配套设施呢??搞了半天,也就是百度搜索支持了 https,百度的其他产品几乎都不支持!

比如,做网站喜欢用到的百度分享,不支持 https,还得自行处理【相关文章】;

比如,大部分网站的经济来源,百度广告不支持 https,搞个蛋哟;

还好,百度统计还能凑合用下,不是那么一无是处。。。

二、正能量

国内各个搜索引擎都看了下,结果意外的发现搜狗居然已经正常收录我博客的 https 了:

其他基本都未收录,而国外的几个搜索引擎基本不用看,换 https 数日之后就全局替换成 https 收录了,而且目测给了更好的排名,比如谷歌、必应等。

百度一直以来都是蜗牛般的反应,真不知是技术不行还是故意设置的?百度的索引服务器再多能多过谷歌?全局刷新一下感觉如登天一般麻烦!

三、解决

吐槽了那么多,还是来说说如何缓解一下各种不支持的窘迫吧!

支持 https 的有:谷歌、必应、搜狗、百度(持怀疑态度)以及用户 不支持的有:    360、神马(宜搜)以及百度(有待验证)等

那我们全站强制 https 就行不通了,必须对这些来路做规则判断,然后针对性的跳转或不跳转才行。

只分享下 Nginx 的做法,其他就自行参考研究吧!

①、http 和 https 不在同一个 server 模块的做法:

Ps:分别监听 80 和 443 端口是大部分网站的做法。

在监听 80 的 server 模块中添加如下规则:

server
    {
        listen 80;
        server_name xxx.com;
        root /data/xxx.com;

        #在此新增如下规则:
        #若UA不匹配百度、360、神马,则跳转到https(若需要加入更多,请以分隔符隔开)
        if ($http_user_agent !~* "BaiduSpider|360Spider|YisouSpider") {
           rewrite ^(.*)$ https://$host$1 permanent;
        }
  #其他略...
}

#监听443的server无需改动
server {
        listen 443 ssl http2;
        #其他略

②、http 和 https 在同一个 server 模块的做法(注意修改实际域名):

server
    {
        listen 80;
        listen 443 ssl;
        ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
        ssl_certificate_key  /usr/local/nginx/ssl/zhangge.net.key;
        ssl_session_timeout  5m;
        ssl_protocols   SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
        server_name zhangge.net;
        
        #在此新增如下规则:
        #如UA不匹配百度、360、神马,则设置变量为y(若需要加入更多,请以分隔符隔开)
        if ($http_user_agent !~* "BaiduSpider|360Spider|YisouSpider") {
            set $ssl "y";
        }
        #若请求协议是http,则继续将变量增量赋值es
        if ($scheme = 'http' ) {
            set $ssl "${ssl}es";
        }
        #若变量值为yes,即命中上述2个条件,则跳转到https
        if ( $ssl = "yes" ) {
            rewrite ^(.*)$ https://$host$1 permanent;
        }
  #以下略...

最后,重载或重启 nginx 即可生效。

简单解释下:若不是百度、360 或神马蜘蛛进行的 http 协议请求,将全部跳转到 https。即强制 https 对 360、百度、神马开了白名单模式,不强制跳转。规则是通用的,你可以把第一条规则中的 UA 标识换成任意不想强制跳转的请求源。

时间有限,就分享这么多了,希望各大搜索引擎尽快兼容 https,希望百度搜索的联动反应能快点,而且不行就别再打肿脸充胖子,要对得起国内搜索第一的地位!


2016/01/05 内容补充:早上看到了 WP 酷的分享,才拍脑袋想起还有 XP 系统不支持 SNI,导致网页无法打开,所以上述新增的规则可以改成如下代码:

场景①适用:

#若UA不匹配百度、360、神马,则跳转到https(若需要加入更多,请以分隔符隔开)
if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
     rewrite ^(.*)$ https://$host$1 permanent;
}

场景②适用:

#如UA不匹配百度、360、神马,则设置变量为y(若需要加入更多,请以分隔符隔开)
if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
    set $ssl "y";
}
#若请求协议是http,则继续将变量增量赋值es
if ($scheme = 'http' ) {
    set $ssl "${ssl}es";
}
#若变量值为yes,即命中上述2个条件,则跳转到https
if ( $ssl = "yes" ) {
    rewrite ^(.*)$ https://$host$1 permanent;
}

2016/01/09 内容补充[推荐使用]:突然想到,既然要兼容那些不支持的请求者,那么当请求到 https 时,是不是应该跳回 http 呢?

比如,使用 XP 系统访问到了 http,我们可以不跳转到 https,但我们全站都是改造成 https 的,所以页面内的链接都是 https 的,那他进一步还是不能访问!

所以,继续加规则,如果是特殊用户,则强制 http 访问:

①、http 和 https 不在同一个 server 模块的做法:

Ps:分别监听 80 和 443 端口是大部分网站的做法。

在监听 80 的 server 模块中添加如下规则:

server
    {
        listen 80;
        server_name xxx.com;
        root /data/xxx.com;

        #在此新增如下规则:
        #若UA不匹配百度、360、神马,则跳转到https(若需要加入更多,请以分隔符隔开)
        if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
           rewrite ^(.*)$ https://$host$1 permanent;
        }
  #其他略...
}

#监听443的server无需改动
server {
        listen 443 ssl;
        ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
        ssl_certificate_key /usr/local/nginx/ssl/zhangge.net.key;
        ssl_session_timeout 5m;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
        server_name zhangge.net;
        #在此新增如下规则:
        #若UA匹配到百度、360、神马、XP系统等不支持请求,则跳转到http(若需要加入更多,请以分隔符隔开)
        if ($http_user_agent ~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
             rewrite ^(.*)$ http://$host$1 permanent;
        }
        #其他略

②、http 和 https 在同一个 server 模块的做法(注意修改实际域名):

server
    {
        listen 80;
        listen 443 ssl;
        ssl_certificate /usr/local/nginx/ssl/zhangge.net.crt;
        ssl_certificate_key  /usr/local/nginx/ssl/zhangge.net.key;
        ssl_session_timeout  5m;
        ssl_protocols   SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
        server_name zhangge.net;
        
        #在此新增如下规则:
        #如UA不匹配百度、360、神马,则设置变量为y(若需要加入更多,请以分隔符隔开)
        if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
            set $ssl "y";
        }
        #若请求协议是http,则继续将变量增量赋值es
        if ($scheme = 'http' ) {
            set $ssl "${ssl}es";
        }
        #若变量值为yes,即命中上述2个条件,则跳转到https
        if ( $ssl = "yes" ) {
            rewrite ^(.*)$ https://$host$1 permanent;
        }
        # ==================== 以下为新增内容 =======================
        #若UA匹配到不支持https的请求,则设置变量为n:
        if ($http_user_agent ~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
            set $ssl "n";
        }
        if ($scheme = 'https' ) {
           set $ssl "${ssl}o";
        }
        #若变量值为no,即命中上述2个条件,则跳转到http
        if ( $ssl = "no" ) {
            rewrite ^(.*)$ http://$host$1 permanent;
        }
  #以下略...

最后,重载或重启 nginx 即可生效。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux+Nginx/Apache/Tomcat新增SSL证书,开启https访问教程

    上上篇文章《nginx 平滑升级&新增模块》提到了公司的 https 访问需求。当我新增了 SSL 模块之后,却发现以前还真没部署过 https 访问。 下面整...

    张戈
  • http加速器Varnish的vcl配置小记(lnmp环境)

    在以前的公司曾安装过 Varnish,可惜还没摸热就离职了,这次接着倒腾了下 Varnish,并搭建成功,特来记录下,以备后用。 一、测试环境 系统版本:Cen...

    张戈
  • Windows 7下获取System权限

    公司推 Win7 了,作为 IT 部门,铁定是先行测试的小白鼠。于是先给我们安装了 Win7 工作环境。一直以来,除了服务器,普通办公 PC 的管理员都是被桌面...

    张戈
  • Flutter | 超简单仿微信QQ侧滑菜单组件

    1.首先可以滑出菜单2.菜单滑动到一定距离完全滑出,未达到距离回滚3.菜单数量、样式随意定制4.菜单点击回调5.菜单展开时,点击 item 收回菜单(见QQ)

    Flutter笔记
  • 个人年度总结及AWD线下赛复盘

    还好有诸位贵人相助(辅导员们,上一届师兄们,学校各位老师以及实习单位师父), 小的也好有条努力的方向,但是时间紧任务重19年5月份就要比赛了,所以学的真的很粗略...

    天钧
  • 个人年度总结及AWD线下赛复盘 拖了很久

    今天记录下第一次参加某全国awd比赛后的一些感想以及学到的些许皮毛知识,也算是对自己自学了小一年的学习成果的检验,防守方面由W.B战队防守队员记录,其他由笔者记...

    用户1631416
  • 个人年度总结及AWD线下赛复盘

    还好有诸位贵人相助(辅导员们,上一届师兄们,学校各位老师以及实习单位师父), 小的也好有条努力的方向,但是时间紧任务重19年5月份就要比赛了,所以学的真的很粗略...

    7089bAt@PowerLi
  • 编程思想与生活经验

    一个对象往往需要跟其他对象打交道,既包括获取依赖于另一对象,也包括仰赖其他对象的行为,一旦发生便称为该对象依赖另一对象。只要有一个依赖另一个的现象发生,则这两者...

    wfaceboss
  • Go教程:10-array数组

    数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构); 这种类型可以是任意的原始类型例如整型、字符串或者自定义类型.数组长度必...

    mojocn
  • 腾讯高校合作2014十件大事你造吗?

    更多信息敬请关注腾讯高校合作站点、官方公众帐号。

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券