.htaccess重写规则和特殊字符的问题

时间:2013-10-27 12:22:26

标签: php .htaccess mod-rewrite url-rewriting special-characters

我使用一些重写规则来为论坛制作可读的网址。例如,如果您发布一个主题标题为“嘿,你觉得这辆新车怎么样?”的新话题。我将创建一个这样的链接: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

我缺少什么?

由于

1 个答案:

答案 0 :(得分:0)

URL转义字符串在您与RewriteRule隐式比较的字符串中解码。这意味着如果你捕获,它们已经被解码了!。

IMO,最好的解决方案是捕获%{THE_REQUEST},它仍然以客户端的方式进行URL编码。这需要1个addl RewriteCond。

第二个选项是使用[B]标志重新退出反向引用。我不是这个人的粉丝,因为重新逃避并不真正意识到替换的去向。