Mod-Rewrite
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’標誌和其他一些標誌,但如果它們是正確使用的東西,我沒有正確使用它們!
任何指針都非常感謝!
為什麼還要費心進行複雜的重寫呢?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 解碼的解決方法。