小心对待rewrite中邪恶的百分号(%)
原文出处: http://blog.eaxi.com/percentage-sign-in-rewrite/
今天遇到一个非常诡异的问题。
我目前是采用 /key1/value1/key2/value2 方式传递参数,非常干净明了。但是今天我试图传递一个urlencode过的字符串时发现,只要URI里带有百分号%,就会导致Apache服务器400错误,警告说“错误的请求”。
/key1/value1/key2/value_with_%_symbol 400 error
/key1/value1/key2/value_without_symbol 200 OK
查阅手册后,发现%是rewrite语法中的特殊字符,会认为是一个变量的开始,就像PHP中的美元符号$。
经测试,很多知名站点也没有解决这个问题,如WP,discuz,osnews等等。
目前找到一个解决方案,但情况有点不太一样,所以也没有测试成功。链接地址:http://stackoverflow.com/questions/734654/modrewrite-doesnt-work-for-a-url-beginning-in-percent-sign
临时解决方案:/key1/value2/?key2=evil_value2 即换回传统的方式来解决问题。
特留此文,以后找到方案时更新。
小诗 11:21 am on June 25, 2010 Permalink |
这个问题可以解决了。
在wp里的重写规则是:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
然后用php中的:$_SERVER['REQUEST_URI']获取网址斜杠后的字符串。
如:
xx.com/%BF%AA%D0%C4
$_SERVER['REQUEST_URI'] 就等于 /%BF%AA%D0%C4
淡淡的阳光 4:51 pm on June 26, 2010 Permalink |
你的路径写得就有问题,如果访问的文件名包含’%',那么合理的url就应该是
/key1/value1/key2/value_with_%25_symbol
而不是
/key1/value1/key2/value_with_%_symbol
admin 1:14 pm on July 1, 2010 Permalink |
@淡淡的阳光
对的,应该先urlencode。