网站建设

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

Jager · 1月3日 · 2016年 · · 9094次已读

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

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

一、案例

①、抓取诊断

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

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

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

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

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

②、真是打脸

2017 年 05 月 25 日更新:偶尔进入站长平台看了一把,居然给我博客自动做了 https 认证,然后去百度搜索 site 了一把我的网站,基本已全部换成了 https,看来百度对 https 的收录已全面展开!全站启用SSL之后,如何兼容不支持https抓取的搜索引擎?

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

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

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

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

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

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

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

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

再次呵呵下。。。

③、配套设施缺憾

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

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

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

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

二、正能量

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

全站启用SSL之后,如何兼容不支持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/zhang.ge.crt;
        ssl_certificate_key  /usr/local/nginx/ssl/zhang.ge.key;
        ssl_session_timeout  5m;
        ssl_protocols   SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
        server_name zhang.ge;
        
        #在此新增如下规则:
        #如 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/zhang.ge.crt;
        ssl_certificate_key /usr/local/nginx/ssl/zhang.ge.key;
        ssl_session_timeout 5m;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
        server_name zhang.ge;
        #在此新增如下规则:
        #若 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/zhang.ge.crt;
        ssl_certificate_key  /usr/local/nginx/ssl/zhang.ge.key;
        ssl_session_timeout  5m;
        ssl_protocols   SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
        server_name zhang.ge;
        
        #在此新增如下规则:
        #如 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 即可生效。

38 条回应
  1. aunsen 2016-1-4 · 13:13

    OMG!真是杠上了!垃圾百毒!!!!!!!!!!!!!!!!!!!!!!!!!!!

  2. 李阳博客 2016-1-5 · 10:02

    百度一向如此,只顾NIP却不管收录质量,广告类的网页收录蛮快的。
    Google收录最慢也是一天,心情好的时候几小时就收录了。所以如果Google进入中国,百度搜索必死无疑~
    不过360的搜索我个人比较看好,收录速度比百度快一点。

  3. 中国淋浴房著名品牌 2016-1-5 · 10:30

    支持一下!

  4. 香港服务器 2016-1-5 · 10:43

    全站启用SSL之后,兼容不支持https抓取的搜索引擎,这个好像很多站长都需要给,可谓是干货

  5. 夏日博客 2016-1-5 · 20:41

    还是喜欢 http,不喜欢加个 s。

  6. themebetter 2016-1-6 · 14:32

    看来博主真是被百度坑了一把!

  7. AdOnCn 2016-1-7 · 15:31

    很好,感谢!

  8. Cyyzaid 2016-1-7 · 20:40

    VC云大法好2333 我和你是同一个vc云节点的(逃) 也就顺便来串个门 顺便问下 可以换个友链吗。https://cyyzaid.cn 我的小站2333

  9. 叶疯子博客 2016-1-7 · 20:57

    写得很有深度~~

  10. 微部落博客 2016-1-8 · 10:22

    这个活儿真是折腾,感觉不想折腾了,百度也好,360也好,实在是坑

  11. 实用网址导航 2016-1-8 · 11:59

    那么多大网站都还没有搞,所以就没必要那么急着去折腾了,目前都还没有完全普及。

    • avatar
      Jager 2016-1-8 · 12:54

      确实是这样,不过喜欢折腾的朋友可以先行,后面跟上的人就不用再走弯路。

  12. 每天签到赚10元 2016-1-8 · 14:44

    不错不错

  13. 叶疯子博客 2016-1-8 · 16:09

    路过~~瞧瞧~~

  14. 实用导航 2016-1-8 · 20:27

    咦,我的评论没了。还有你回复评论时,邮箱会收到两份通知。

    • avatar
      Jager 2016-1-8 · 23:21

      沙发就是你的评论,没丢啊。。。你这眼神。。。
      邮箱发2份现在应该没了吧。

  15. 包子 2016-1-10 · 10:01

    博主,你那个文章小标题下划线怎么弄的??

  16. 瑾瑜 2016-1-10 · 17:16

    百度,磨磨唧唧惯了……

  17. MM186 2016-1-11 · 15:47

    关于对百度的Https的吐槽,也说也了我的心声!!!
    百度分享、百度联盟、还有百度的链接推送(JS版的),都不支持https。。

  18. 网赚博客 2016-1-11 · 17:13

    百度的算法比较复杂可能会慢些

  19. 午夜读书 2016-1-14 · 16:33

    百度是故意的吧 我的网站上线一个月了只收录一个首页

  20. 西贝博客 2016-1-17 · 14:22

    最近发现很多都加密了

  21. IMwenlu 2016-1-18 · 14:37

    我用的php虚机,用了伪静态规则来跳转

  22. 小超 2016-2-1 · 22:50

    不错,支持支持,为什么https://www.zhang.ge/不解析呢?是不是别有用意呀,求博主赐教

  23. Anonymous 2016-2-28 · 12:24

    0签到成功!签到时间:上午11:56:51,每日签到,生活更精彩哦~

  24. 同盟源 2016-3-12 · 0:53

    直接用UA判断跳转

  25. PolarBear 2016-3-21 · 14:32

    [color=red]不错,收藏了,以后会有用的。[/color]

  26. 小超 2016-5-3 · 17:17

    Jager博主,今天发现其实不是百度该打脸的并不是site:https://www.baidu.com,而是他根本就是完全匹配,不是查询路径,比方说http://www.baidu.com也是收录不到的,嘻嘻,有一个问题很好奇,现在百度已经支持https收录了,统计代码已经出来了,为什么要修改回http呀?

  27. biebb 2016-11-29 · 1:38
    Stoping LNMP...
    Stoping nginx... nginx: [emerg] unknown directive "        if" in /usr/local/nginx/conf/vhost/blog.biebb.online.conf:5
     failed. Use force-quit
    

    下面是我的配置文件,帮看看哈

     server{
          listen 80;
          server_name blog.biebb.online;
          root  /home/wwwroot/blog.biebb.online;
            if ($http_user_agent !~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
               rewrite ^(.*)$ https://blog.biebb.online$1 permanent;
            }
       }
     
     server {
           listen 443 ssl;
           server_name blog.biebb.online;
    	   add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
           root  /home/wwwroot/blog.biebb.online;
           index index.html index.htm index.php default.html default.htm default.php;
           include wordpress.conf;
           #error_page   404   /404.html;
           include enable-php.conf;
           ssl_certificate /usr/local/ssl/blog.biebb.online.pem;
           ssl_certificate_key  /usr/local/ssl/blog.biebb.online.key;
           ssl_session_timeout  5m;
           ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
           ssl_ciphers  HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
    	   rewrite ^/go/(.*)$ /go.php?url=$1 last;
            if ($http_user_agent ~* "Windows\ NT\ 5.1|Windows\ NT\ 5.2|BaiduSpider|360Spider|YisouSpider") {
                 rewrite ^(.*)$ https://blog.biebb.online$1 permanent;
            }
           location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    	   {
    		        # d - 天
    				# h - 小时
    				# m - 分钟
                    expires 30d;
                    add_header Pragma public;
                    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
           }
    
    	   location ~ .*\.(js|css)?$
    	   {
                    expires 5h;
                    add_header Pragma public;
                    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
           }
    
           location ~ /\.
           {
                deny all;
           }
    
           access_log off;
       }
    
    • biebb 2016-11-29 · 1:57

      不好意思Jager,还是我个人的问题。。。帮忙把上面的评论删了吧,谢谢

  28. onlineage 2017-1-3 · 15:20

    全站ssl后 百度快照 302到原网页 智能摘要也抓不到图片了 啥情况

  29. 笑你马勒隔壁 2017-1-7 · 15:45

    请问,我今天花了一千多块在百度云加速开通了专业版的服务,目的就是为了一个一键实现HTTPS,就是来取个经,是不是掏钱了就什么都不用管了?

  30. 明月登楼 2017-4-14 · 21:20

    从来没有指望SSL能给我带来多大的收录量提升!我纯粹就是为了折腾而折腾。如果不支持SSL那就无视!我不能永远跟落伍的在一个起跑线上!

  31. 涂红伟 2017-5-23 · 10:24

    现在百度已经开始收录了https,我的博客启用https后强制 http 301重定向 https 目前已经有部分收录的链接更新为https,百度的响应确实和google bing比不了,那些在我启用https后几天内完成了大部分链接的更新,百度花了几个月才慢慢更新。

    • avatar
      Jager 2017-5-25 · 22:08

      确实,刚去站长平台看了下,居然自动给我博客做了https认证,site已全部换成https了,看来已全面支持。

      • boke112导航 2017-5-31 · 22:56

        好像Robots工具暂不支持https站点,是不是说HTTPS站点就不需要使用Robots.txt了???

        • avatar
          Jager 2017-6-2 · 12:48

          应该只是测试工具不支持https,实际蜘蛛的抓取还是会先探测robots内容。

  32. haha233 2017-8-15 · 15:40

    博主好,我们网站只有M站做了https,PC站没有做,但是现在百度收录的pc端链接却是https的链接,是百度抓取到M站就默认全部都做了https吗?