我使用一些重写规则来为论坛制作可读的网址。例如,如果您发布一个主题标题为“嘿,你觉得这辆新车怎么样?”的新话题。我将创建一个这样的链接:forum/cars/51-Hey-what-do-you-think-of-this-new-car-?
其中51是主题ID。
在我的.htaccess中我使用了这个重写规则:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^forum/([0-9-a-z]+)/?$ forum/list_topics.php?key=$1 [L]
RewriteRule ^forum/([0-9-a-z]+)/([0-9]+)?$ forum/list_topics.php?key=$1&page=$2 [L]
RewriteRule ^forum/([0-9-a-z]+)/([0-9]+)-(.*)/?$ forum/list_post.php?topic=$2 [L]
所以这个工作正常,除非我发布带有这些字符的主题标题:+"*ç%&/()=?'^
我使用php函数创建url:
$url_topic = str_replace(' ', '-', $url_topic); //replace space with -
$url_topic = urlencode($url_topic);//encode url
在这种情况下,$ url_topic的值为:34-%2B%22%2A%C3%A7%25%26%2F%28%29%3D%3F%27%5E
但是当我点击它时,我有以下错误:
Not Found
The requested URL /forum/cars/34-+"*ç%&/()=?'^ was not found on this server.
Apache/2.2.22 (Ubuntu) Server at localhost Port 80
我缺少什么?
由于
答案 0 :(得分:0)
URL转义字符串在您与RewriteRule隐式比较的字符串中解码。这意味着如果你捕获,它们已经被解码了!。
IMO,最好的解决方案是捕获%{THE_REQUEST},它仍然以客户端的方式进行URL编码。这需要1个addl RewriteCond。
第二个选项是使用[B]标志重新退出反向引用。我不是这个人的粉丝,因为重新逃避并不真正意识到替换的去向。