Mod_rewrite não funciona com valores codificados em URL

2

espero que alguém possa me ajudar com isso, pois está me enlouquecendo.

Eu quero poder aceitar URLs que contenham um cálculo como:

http://www.calcatraz.com/api/calc/3*3.txt

E reescreva-os neste formato:

http://www.calcatraz.com/calculator/api.php?a=calc&c=3*3&f=.txt

O caso acima funciona bem quando eu uso esta regra de reescrita:

<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>    

Mas ele é dividido em URLs que contêm caracteres especiais, que serão codificados por URL. Por exemplo, 3/3 seria solicitado usando:

http://www.calcatraz.com/api/calc/3%2F3.txt

Eu gostaria de reescrever, como antes, para:

http://www.calcatraz.com/calculator/api.php?a=calc&c=3%2F3&f=.txt

Mas isso não acontece - apenas recebo um erro de objeto não encontrado. Eu brinquei com a bandeira 'B' e alguns outros, mas se eles são a coisa correta para usar, eu não os tenho usado corretamente!

Todos os ponteiros são muito apreciados!

    
por Calcatraz 29.07.2011 / 23:04

1 resposta

1

Por que incomodar-se com uma reescrita complexa? O PHP pode lidar com isso muito mais fácil. Eu estava entediado, então coloquei um exemplo simples de trabalho .

Por padrão, o Apache httpd decodifica% 2f (uma barra) antes de processar a solicitação. Isto não tem nada a ver com o mod_rewrite. Eu não tenho idéia porque é habilitado por padrão. Coloque o seguinte na definição apropriada do VirtualHost. Desculpe, isso não funciona em um arquivo .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/>";

Atualizado para resolver totalmente o problema de codificação.
Atualizado novamente com solução alternativa para a decodificação de url do Apache.

    
por 30.07.2011 / 02:26