Назад | Перейти на главную страницу

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/>";

Обновлено, чтобы полностью устранить проблему с кодировкой.
Снова обновлен с обходом для декодирования URL-адресов Apache.