Apache reescreve regras e caracteres especiais

1

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:

  • Como posso criar um regexp para substituir espaços com "% 2520"?
  • Essa é a única maneira de lidar com esse problema (além de uma pesquisa e substituição completa que, como eu disse, não pode ser feita) ou você tem alguma ideia melhor?

Editar:

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

Editar 2:

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.

    
por Massimo 20.05.2010 / 16:32

1 resposta

3

O% está sendo lido como uma referência anterior, então você precisa escapar do%.

    
por 20.05.2010 / 16:44