Mod_rewrite不使用URL编码值

希望有人能帮助我,因为这让我疯狂。

我希望能够接受包含计算的URL,例如:

http://www.calcatraz.com/api/calc/3*3.txt 

并将其重写为这种格式:

 http://www.calcatraz.com/calculator/api.php?a=calc&c=3*3&f=.txt 

当我使用这个重写规则时,上面的例子工作正常:

 <IfModule mod_rewrite.c> Options +FollowSymLinks Options +Indexes RewriteEngine On RewriteRule ^api/calc/(.+)(\.(txt|sci))?$ calculator/api.php?a=calc&c=$1&f=$2 [L] </IfModule> 

但是,包含特殊字符的url会被分解,url将被编码。 例如3/3将被要求使用:

 http://www.calcatraz.com/api/calc/3%2F3.txt 

我想这样重写,像以前一样:

 http://www.calcatraz.com/calculator/api.php?a=calc&c=3%2F3&f=.txt 

但它不 – 我只是得到一个对象没有find错误。 我已经玩了“B”旗和其他一些,但如果他们是正确的使用,我没有正确使用它们!

任何指针不胜感激!

为什么即使打扰一个复杂的重写? PHP可以处理它更容易。 我很无聊,所以我举了一个简单的工作例子 。

默认情况下,Apache httpd在处理请求之前解码%2f(斜线)。 这与mod_rewrite无关。 我不知道为什么它默认启用。 将以下内容放在适当的VirtualHost定义中。 对不起,它不能在.htaccess文件中工作。

 AllowEncodedSlashes On 

的.htaccess

 RewriteEngine On RewriteRule /api/calc/.* api.php 

api.php

 <?php define('STRIP_URI', '/api/calc/'); define('REGEX_URI', '/^(?P<calc>.+)(?P<ext>\.(txt|sci))?$/U'); $clean_request_uri = rawurldecode(str_replace(STRIP_URI, '', $_SERVER['REQUEST_URI'])); $math = array(); preg_match(REGEX_URI, $clean_request_uri, $math); echo $math['calc'] . "<br/>"; echo $math['ext'] . "<br/>"; 

已更新为完全解决编码问题。
再次更新Apache解码的解决方法。