昨天同事發現一個奇怪的事情,在百度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
确實如此
确實如此是的
是的