希望有人能帮助我解决这个问题,因为它让我发疯。
我希望能够接受包含如下计算的 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 解码的解决方法。