O% está sendo lido como uma referência anterior, então você precisa escapar do%.
Eu tenho um servidor onde alguns arquivos têm um real %20
em seu nome (eles são gerados por uma ferramenta automatizada que lida com espaços dessa maneira, e não posso fazer nada sobre isso) ; isso não é um espaço: é "%" seguido de "2" seguido de "0".
Neste servidor, há um servidor web Apache, e há algumas páginas da Web que se vinculam a esses arquivos, usando seu nome em URLs como http://servername/file%20with%20a%20name%20like%20this.html
; essas páginas são também geradas pela mesma ferramenta, então eu (de novo!) não posso fazer nada sobre isso. Uma pesquisa e substituição completa em todos os arquivos, páginas e URLs está fora de questão aqui.
O problema: quando o Apache é chamado com uma URL como a acima, ele (corretamente) traduz os "% 20" em espaços e, é claro, não consegue encontrar os arquivos , porque eles não têm espaços em seus nomes.
Como posso resolver isso?
Descobri que, usando um URL como http://servername/file%2520name.html
, ele funciona muito bem, porque o Apache traduz "% 25" em um sinal "%" e, assim, o nome de arquivo correto é criado.
Eu tentei usar uma regra de reescrita do Apache, e posso substituir com sucesso espaços com hipenses com uma sintaxe como esta:
RewriteRule (.*)\ (.*) $1-$2
O problema: quando tento substituí-los por uma sequência "% 2520", isso simplesmente não acontece. Se eu usar
RewriteRule (.*)\ (.*) $1%2520$2
o URL resultante é http://servername/file520name.html
; Eu tentei "% 25" também, mas eu só recebo um "5"; parece que a inicial "% 2" foi descartada.
As perguntas:
Escapar foi a chave, funciona usando esta regra:
RewriteRule (.*)\ (.*) $1\%2520$2
Mas só funciona se houver um "% 20" no URL inicial; Eu recebo um "erro interno do servidor" se houver mais de um.
Parece que estou quase lá ... por favor ajude: -)
Consegui que funcionasse para dois espaços usando a seguinte regra:
RewriteRule (.*)\ (.*)\ (.*) $1\%2520$2\%2520$3
Isso é suficiente para minhas necessidades, pois as URLs geradas pela ferramenta só podem conter no máximo dois "% 20" s; mas, por curiosidade: existe alguma maneira de fazer isso funcionar com qualquer número de espaços? Ele funciona com a primeira regra se substituir qualquer número de espaços por um caractere normal, esse problema ocorre somente quando caracteres especiais estão envolvidos.