Como você evita que o mod_rewrite decodifique uma string no caminho? [duplicado]

1

Estou tentando criar uma API sossegada usando o mod_rewrite.

Eu tenho a regra:

RewriteRule v2/(.*)$ v1/index.php?request=$1 [QSA,NC,L]

No entanto, o caminho pode conter strings codificadas em base64 (ou seja, pode ter + ou /) e elas estão sendo decodificadas antes de chegar ao PHP.

Por exemplo, se eu for para

/v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe

O PHP obtém $_REQUEST['request'] como cards/9VwQLli f0ogFl19AVRFLuztbp8cP0rYCgXBu3H9 Dc=Be' .

E para piorar as coisas, se eu adicionar uma barra lá (por exemplo, 9VwQLli%2Bf0ogFl19AVRFLuztbp8c%2FP0rYCgXBu3H9%2BDc%3DBe - o %2F é a barra) recebo um 404.

Como posso evitar que isso aconteça?

Observação: tentei as sinalizações B e NE , mas elas não tiveram nenhum efeito. Eu suponho que como um hack eu poderia converter todos os + caracteres para _ e todos / para - , ou talvez até duplicar url codificando, mas eu queria saber se havia uma maneira melhor.

    
por Mike 16.04.2015 / 09:01

1 resposta

7

Você não faz. O servidor da Web tem permissão para decodificar caracteres codificados em porcentagem que não decodificam para caracteres especiais antes de aplicar regras de regravação, e tem permissão para decodificar o restante dos caracteres codificados por porcentagem antes de passar os dados para o seu aplicativo da Web. (Veja o RFC 3986.)

O que você deve fazer é aplicar o padrão do controlador frontal em seu aplicativo da Web e manipular todos os percentuais de decodificação (e solicitar o roteamento). Nesse caso, você simplesmente redirecionará todas as solicitações que não corresponderem a um arquivo ou diretório para /index.php e, em seguida, lerá a URL em $_SERVER['REQUEST_URI'] . É assim que os principais aplicativos da Web baseados em PHP, como o WordPress e o MediaWiki, lidam com isso.

    
por 16.04.2015 / 09:08