...the best way to attack this?
Esta é realmente uma tarefa para sua aplicação web (por exemplo, PHP, Python, etc.), não para o Apache ( .htaccess ).
Se este script for "público", então ... "Redirecionar" scripts desta natureza são frequentemente abusados por golpistas ( por exemplo , então você precisa listar em branco os possíveis destinos de redirecionamento (e, opcionalmente, autenticar o remetente). Isso pode ser difícil de implementar em .htaccess e provavelmente é mais adequado para o seu próprio aplicativo.
https://www.example.com/application?user=543&AppLink=https%3A%2F%2Fwww.domain2.com%2Fregister%2Freg.aspx?EnquiryID=12345
Os caracteres : e / não precisam ser codificados por URL quando aparecerem na parte da string de consulta do URL. Mas se você codificasse corretamente o URL do valor do parâmetro AppLink URL, você também codificaria%% do ? e = (parte do URL de destino).
First up, the introduction of the encode breaks the working RewriteRule, resulting in this with the http_host name back in - I don't follow why it does that:
A variável do servidor QUERY_STRING não é% -decoded. Então, a string resultante substituição é:
https%3A%2F%2Fwww.example.net%2Fregister%2Freg.aspx?EnquiryID=12345
Apache / mod_rewrite vê isso como uma URL relativa , porque ela não inicia com uma barra ou esquema válido (por exemplo, https:// ). No caso de uma URL relativa, mod_rewrite usa o esquema e o nome do host (e prefixo de diretório ou valor da diretiva RewriteBase ) da solicitação atual (por padrão), para construir uma URL absoluta para o external redirecionar , daí o redirecionamento malformado que você está vendo.
Solução
Como mencionado acima, eu recomendaria fazer isso em seu aplicativo, não em .htaccess . Mas de qualquer forma, para responder a sua pergunta específica, você poderia fazer algo como o seguinte, em vez de suas diretivas atuais. No entanto, isso requer o Apache 2.4+ e o acesso ao seu server-config (já que AllowEncodedSlashes não é permitido em um diretório / .htaccess context):
Os itens a seguir precisam estar em seu server-config (ou virtualhost):
# Allow %2F to be used in the URL-path part of the URL
# Otherwise Apache will trigger a system generated 404 (security feature)
AllowEncodedSlashes On
Então, em .htaccess :
# Convert URL param value to path-info (via URL rewrite)
# This essentially %-decodes the URL parameter value
RewriteCond %{QUERY_STRING} AppLink=(.+)
RewriteRule ^application$ /application/%1 [QSD]
# Issue redirect using the %-decoded URL-path
RewriteRule ^application/(https?:/)(.+) $1/$2 [R,L]
Notas:
- Quando possível, é mais eficiente verificar o caminho da URL usando o padrão
RewriteRuleem vez de usar uma condição adicional que verifica o servidorREQUEST_URIvariável. - O sinalizador
QSD(Query String Discard) é necessário para descartar o parâmetro de URLAppLink(e qualquer outro) da solicitação inicial. - A primeira reescrita de URL é passada para a próxima diretiva que aciona o redirecionamento real. As diretivas
RewriteRulenaturalmente se encaixam juntas, a saída de uma é usada como entrada da próxima e assim por diante. - O caminho do URL com o qual o padrão
RewriteRuleé correspondido é% -decoded. (Considerando que a variável de servidorQUERY_STRINGpermanece% -codificada.) No entanto, as barras contíguas no caminho da URL são reduzidas a barras únicas. Daí a verificação de apenashttps:/(nãohttps://) no padrãoRewriteRulee da barra adicional que é adicionada na substituição .
Isso também pressupõe que informações adicionais de nome de caminho são permitidas em sua configuração. Talvez seja necessário definir explicitamente AcceptPathInfo On em .htaccess (ou server-config), se não. Se não, então você também terá um sistema gerado 404.