- 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
- 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
.
- 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