надеюсь, кто-нибудь может мне помочь с этим, потому что это сводит меня с ума.
Я хочу иметь возможность принимать 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/>";
Обновлено, чтобы полностью устранить проблему с кодировкой.
Снова обновлен с обходом для декодирования URL-адресов Apache.