Mod-Rewrite

Mod_rewrite 不使用 URL 編碼值

  • August 6, 2016

希望有人可以幫助我,因為它讓我發瘋。

我希望能夠接受包含計算的 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’標誌和其他一些標誌,但如果它們是正確使用的東西,我沒有正確使用它們!

任何指針都非常感謝!

為什麼還要費心進行複雜的重寫呢?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 解碼的解決方法。

引用自:https://serverfault.com/questions/295664