最近同事從訪問日志和統計分析中發現有一些400報錯和一些錯誤網頁,我們自己訪問也打不開,是網址有問題,我翻看了以前寫的博客《百度對網址二次編碼的問題》,問題很類似。
以前的錯誤網址:
https://tw.chahaoba.com/%25E8%25AE%25A8%25E8%25AE%25BA:80004911
.htaccess中寫的跳轉規則:
RewriteCond %{REQUEST_URI} ^(.*)%(.*)$ RewriteRule ^.*$ https://%{HTTP_HOST}%1%%2 [L,R=301,NE]
但這次二次編碼不是出現在REQUEST_URI中而是出現在QUERY_STRING中,所以以前在.htaccess中寫的跳轉規則還不起作用。
這次遇到的錯誤網址:
https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%25AE%25A8%25E8%25AE%25BA:80004911
于是查了一些資料,發現QUERY_STRING中的%需要寫為\%25,否則可能引起循環重定向。修改寫法後就可以了,如下:
RewriteCond %{REQUEST_URI} ^\/index\.php$ RewriteCond %{QUERY_STRING} ^(.*)title=(.*)\%25(.*)$ RewriteRule ^.*$ /index.php?%1title=%2%%3 [L,R=301,NE]
從Chrome浏覽器的Network調試模式可以看到跳轉過程:
跳轉了6次:
https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%25AE%25A8%25E8%25AE%25BA:80004911p0 https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%25AE%25A8%25E8%25AE%BA:80004911p0 https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%25AE%25A8%25E8%AE%BA:80004911p0 https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%25AE%25A8%E8%AE%BA:80004911p0 https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%25AE%A8%E8%AE%BA:80004911p0 https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%25E8%AE%A8%E8%AE%BA:80004911p0 https://tw.chahaoba.com/index.php?action=edit&redlink=1&title=%E8%AE%A8%E8%AE%BA:80004911p0
每次把一個%25轉為%,直到6個%25都轉為%
“讨論”兩個漢字
url編碼成為6個字節:%E8%AE%A8%E8%AE%BA
被百度再次編碼成為錯誤的:%25E8%25AE%25A8%25E8%25AE%25BA
我們現在在.htaccess裡面設置urlrewrite還原就可以了👌
评论