htaccess - redireciona para URL a partir da string de consulta

1

Eu tenho o seguinte URL:

example.com/?redirect=some-url-encoded

Eu preciso redirecioná-lo para o URL especificado na string de consulta ( redirect parameter).

Eu tentei:

RewriteCond %{QUERY_STRING} redirect=(.+)
RewriteRule ^(.*)$ %1 [R=302,L,QSA]

Mas fui redirecionado para o URL:

example.com/some-url-encoded?redirect=some-url-decoded

Então:

  1. meu URL não é decodificado
  2. a string de consulta antiga é aplicada.
  3. o URL é iniciado a partir de example.com

Como lidar corretamente com isso?

    
por pwas 01.08.2016 / 21:36

2 respostas

4
  1. my URL is not decoded

A variável de servidor QUERY_STRING não é decodificada por URL, e o mod_rewrite também codificará por URL a substituição, então você provavelmente terminará com um URL duplamente codificado? Você provavelmente precisará do sinalizador NE ( NOESCAPE ).

No entanto, se vírgulas e barras (como em http:// ) forem codificadas com URL (ou seja, http:%3A%2F%2F ) no parâmetro da string de consulta, elas serão passadas para a substituição já codificada, negando seu significado normal em uma URL . Embora a maioria das funções de codificação de URL codifique esses caracteres, eles não precisam ser codificados no valor do parâmetro de URL (embora isso possa depender da configuração do servidor - se você estiver alterando o que o servidor considera delimitadores de URL - mas isso é raro) . Portanto, codifique todos os outros caracteres, exceto : e / no valor do parâmetro de URL. Por exemplo, em vez de:

example.com/?redirect=https%3A%2F%2Fwww.google.pl%2F

Deixe os caracteres : (dois pontos) e / (barra) sem codificação:

example.com/?redirect=https://www.google.pl/

Uma alternativa, em vez de usar um parâmetro de URL, é usar PATH_INFO adicional no final do URL, já que isso deve ser automaticamente decodificado por URL. No entanto, isso depende da diretiva AcceptPathInfo e você também precisará ativar AllowEncodedSlashes (na configuração do servidor), mas isso vem com suas próprias preocupações de segurança. Veja os documentos do Apache: link

  1. old query string is applied.

Você está explicitamente informando ao mod_rewrite para aplicar a string de consulta original com o sinalizador QSA (Query String Append). Mas vai fazer isso por padrão de qualquer maneira. Você precisa explicitamente removê-lo com o sinalizador QSD (Query String Discard) no Apache 2.4+ ou inclua um ? na substituição RewriteRule .

  1. URL is started from example.com

Você precisa incluir uma URL absoluta (ou seja, completa com o esquema http:// ) no parâmetro de URL (ou explicitamente codificar isto na substituição?). Observe que, se os dois pontos e / ou barras em http:// forem codificados em URL, o Apache não verá isso como uma URL absoluta e será tratado como relativo (ao diretório atual) ao qual o Apache prefixará o prefixo de diretório e tente torná-lo absoluto (por causa do R flag - um redirecionamento externo ) prefixando o protocolo e o domínio atual, por exemplo. %código%. Isso não só corromperá totalmente o redirecionamento, mas também exporá sua estrutura de diretório interna.

Reunindo tudo isso, tente o seguinte:

RewriteCond %{QUERY_STRING} redirect=(.+)
RewriteRule ^ %1? [R=302,L,NE]

Isto está assumindo que o protocolo / esquema é passado no parâmetro de string de consulta. por exemplo. http://example.com

Um subpadrão com parênteses no padrão http://example.com/?redirect=http://www.google.pl/ (ou seja, RewriteRule ) parece ser desnecessário aqui.

Uma palavra sobre segurança

Observe que permitir que qualquer URL absoluto seja usado como destino em um script de redirecionamento simples como este é um risco de segurança. Se os hackers descobrirem isso, é provável que seja abusado e usado como parte de uma cadeia de redirecionamento, direcionando os usuários a fazer o download de softwares maliciosos e afins.

Veja também: link

    
por 01.08.2016 / 23:33
0

Você está indo pelo caminho errado. Use RewriteCond / RewriteRule para reescrever o caminho (com QSA para manter a string de consulta) em um script (PHP ou algum CGI, o que você quiser), e então faça com que o script inclua as restrições de lógica e correção para obter o redirecionamento que você gosta. / p>

Isso também fornece funcionalidade de habilitação útil. Algumas ideias:

  • Insensibilidade a maiúsculas e minúsculas, insentividade do sepeartor (this-thing versus thisthing versus ...)
  • Alimente esses redirecionamentos de um banco de dados
    • que poderia, então, ter um frontend para os mantenedores da web confiáveis para adicionar links e permitir algum tipo de manutenção do ciclo de vida.
  • Você pode até fazer coisas como usar a distância de edição para ajudar a determinar qual documento era desejado (consulte link )
por 02.08.2016 / 13:08