最近同事从访问日志和统计分析中发现有一些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还原就可以了👌
评论