Configurando o htaccess / mod_rewrite para servir arquivos estáticos com ponto de interrogação na URL

3

Acabei de aceitar a hospedagem de um site antigo que foi convertido de asp para html estático, consistindo em aproximadamente 6.000 arquivos. No entanto, o meu servidor não gosta dos nomes dos arquivos, dando um erro 404. As URLs são todas do formulário:

filename.asp?id=123&a=something.html

onde id é sempre um inteiro e a é sempre uma cadeia de caracteres & números.

Existe alguma maneira de usar o htaccess e o mod_rewrite para dizer que o ponto de interrogação faz parte da URL em vez de significar uma string de consulta?

    
por Simon Blackbourn 02.06.2011 / 18:54

3 respostas

4

Você provavelmente já sabe que está não a primeira pessoa a tem essa necessidade :)

# Allow filenames containing '?' to be served by escaping the '?' in the HTTP
# request so it's not interpreted as a query string.
#
# Apache 2.2: set query string to empty by ending rewritten path with '?'.
# Apache 2.4: use the qsdiscard flag instead
#
RewriteCond %{QUERY_STRING} !=""
RewriteRule ^/(.*) /$1\%3F%{QUERY_STRING}? [noescape,last,redirect]

A chave é a combinação de adicionar um redirecionamento e NE / noescape para garantir que o apache não escape do que não queremos que escape.

A regra acima significará que todo o site sob essa reescrita tratará ? como parte do nome do arquivo. Se você precisar que ele corresponda ao seu filename.asp - basta adicioná-lo ao RewriteRule

    
por 03.06.2011 / 17:36
1

Eu sugeriria uma reescrita que servisse diretamente o arquivo, escapando do "?" para "\% F3".

Para veicular arquivos:

RewriteCond %{QUERY_STRING} !=""
RewriteRule ^(.*)$ $1\%3F%{QUERY_STRING}? [L]

Faça o mesmo com as pastas (por exemplo, index.html - adapte index.html para atender às suas necessidades)

RewriteCond %{REQUEST_FILENAME} ^.*/$
RewriteCond %{QUERY_STRING} !=""
RewriteRule ^(.*)/$ $1/index.html\%3F%{QUERY_STRING}? [L]

Primeiro, testamos se o arquivo existe (veja o próximo parágrafo sobre isso), segundo verificamos se temos uma string de consulta (caso contrário, servir o arquivo como de costume), então adicione o "?" e a string de consulta original e veicule-a.

eu adiciono o "?" no final, para apagar o QueryString (já que ele já foi manipulado), e para evitar que a regra seja aplicada uma segunda vez (ex: se estiver servindo um arquivo em um subdiretório). Outra solução seria usar o sinalizador "END" (consulte link ). De acordo com a mesma página, e como mencionado por @csharkey e @Gavin C, [qsdiscard] poderia ser adicionado no apache 2.4:

RewriteRule ^(.*)/$ $1/index.html\%3F%{QUERY_STRING}? [L,qsdiscard]

Advertência: Eu não testei esta solução profundamente, então os erros podem permanecer.

    
por 12.03.2015 / 07:37
0

Eu converti um site antigo do Joomla com wget --mirror . No meu caso, todos os links passaram pelo arquivo index.php, então todos são algo como site.com/index.php?blabla=haha .

Resolvi o problema adicionando um arquivo index.php com o seguinte conteúdo:

<?php

include 'index.php?' . $_SERVER['QUERY_STRING'];

Desta forma, você nem precisa do módulo de reescrita. Obviamente, ele funciona um pouco pior, e talvez seja menos elegante, mas pelo menos você não precisa converter link / nomes de arquivos.

    
por 17.03.2015 / 22:14