Mod_rewrite 无法处理 URL 编码值

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

但事实并非如此 - 我只是收到一个对象未​​找到错误。我尝试过“B”标志和其他一些标志,但如果它们是正确的,那么我一直没有正确使用它们!

非常感谢任何指点!

答案1

为什么要费心进行复杂的重写?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 URL 解码的解决方法。

相关内容