昨天同事发现一个奇怪的事情,在百度APP中搜索一个关键词,我们网站排在第一位,显示的内容也是正常的,点击这个链接进入我们网站却显示“无法找到页面”,检查是进入的网址在我们网站并不存在,是百度对我们的URL二次编码造成的,例如:
https://hanyucidian.18dao.cn/hanyu/%25E5%258F%25A3%25E8%2588%258C%25E5%2591%2586%25E9%2592%259D?mip
这个网址是不存在的,正确的网址应该是:
https://hanyucidian.18dao.cn/hanyu/%E5%8F%A3%E8%88%8C%E5%91%86%E9%92%9D?mip
比较上面两个网址,发现百度把我们网址中的%转为%25了,请看下面的转码过程:
- 汉字:口舌呆钝
- 一次转码:%E5%8F%A3%E8%88%8C%E5%91%86%E9%92%9D
- 二次转码:%25E5%258F%25A3%25E8%2588%258C%25E5%2591%2586%25E9%2592%259D
我们反复在多个网站测试,得到的结果:
- 百度PC搜索出错的机率较少,m.baidu.com搜索有些出错,百度APP出现错误的机率更多;
- 百度MIP对汉字网址的识别、处理存在比较大的问题,持续非常长的时间一直没有解决;
- 主要是对%编码成%25造成问题;
- 还有是对?mip编码为%3Fmip也造成问题;
-
百度并不总是出错,在某搜索些版本,对某些页面,在不同的时候可能出错也可能不出错。
今天与同事花了好处时间查看、商议,可以在Apache的access.log日志中查看,或者使用这种Linux命令来过滤:
cat access_2019-12-19.log |grep %25.*HTTP/1.1\"\ 400
就可以把网址中包含%25并且报400“请求无效 (Bad request)”错误的过滤出来,也有些是404报错,就这样过滤:
cat access_2019-12-19.log |grep %25.*HTTP/1.1\"\ 404
前面我们测试中发现百度搜索结果中点击进入我们网站发现无法访问,这种体验是非常糟糕的,我们以前也曾经多次向百度提交反馈,但都得不到实质性的回复和处理。我们商议只能是自己通过跳转来解决,可以在处理找不到内容的模板中用PHP程序进行识别、处理,也可以在Apache中设置,一个.htaccess设置例子如下:
# 2019-12-19 %25 redirect to % RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$ RewriteCond %{REQUEST_URI} ^(.*)%(.*)$ RewriteRule ^.*$ https://%{HTTP_HOST}%1%%2 [L,R=301,NE] # 2019-12-19 %3Fmip redirect to ?mip RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$ RewriteCond %{REQUEST_URI} ^(.*)\?mip(.*)$ RewriteRule ^.*$ https://%{HTTP_HOST}%1?mip%2 [L,R=301]
这样确实可以解决百度mip爬虫爬取错误网址找不到以及百度搜索把浏览者引导到报错页面的问题。国内使用汉字网址的网站还不算太多,百度这种错误处理一直没有重视和解决,而在Google以及AMP页面的网址处理中从来没有遇到过这种错误。百度的这种错误影响的网站肯定不止我们一家,所以我还是记录写成博客,希望对其他朋友有帮助,也欢迎留言探讨。
评论2
确实如此
确实如此是的
是的