IIS10 URL Rewrite 2.1 problema de codificação dupla

1

Eu tenho um servidor IIS10 com ARR 3.0 e URL Rewrite Module 2.1 que atua como um proxy reverso para vários outros servidores da web. Os outros servidores são executados em portas diferentes, portanto, o servidor IIS10 fornece 'URLs amigáveis' na porta 80. A regravação de URL é usada para entregar a solicitação para o servidor de backend.

Um desses servidores é Jenkins .

Jenkins tem uma mensagem de aviso que informa se o proxy reverso está bem configurado ( mais detalhes aqui ), e esta mensagem de aviso me ajudou a encontrar um problema no meu proxy reverso.

O problema é que a regravação de URL está decodificando e codificando meus URLs de uma forma que, quando chegam ao Jenkins, são diferentes do que o navegador solicitou.

Exemplo:

Regra de reconfiguração de URL:

<rule name="Jenkins Rewrite" stopProcessing="true">
   <match url="(.*)" />
   <conditions>
     <add input="{HTTP_HOST}" pattern=".*jenkins.mydomain.*" />
     <add input="{HTTPS}" pattern="on" />
   </conditions>
   <action type="Rewrite" url="http://localhost:8080/{R:1}" appendQueryString="true" />
   <serverVariables>
     <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" />
     <set name="HTTP_X_FORWARDED_SCHEMA" value="https" />
     <set name="HTTP_X_FORWARDED_PROTO" value="https" />
   </serverVariables>
 </rule>

Ao enviar o seguinte URL:

link

Percebi que os caracteres codificados estavam sendo decodificados antes de acionar a regra, fazendo {R: 1} ficar assim:      /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https:/jenkins.mydomain/manage/

Depois de algumas pesquisas, descobri que podia usar {UNENCODED_URL} em vez de {R: 1} para obter a string de solicitação antes da decodificação. ação de regra:

<action type="Rewrite" url="http://localhost:8080{UNENCODED_URL}" appendQueryString="false" />

Infelizmente, a regravação de URL está codificando o URL novamente após minha regravação, o que torna o URL recebido pelo Jenkins codificado em dobro:

/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%253A%252F%252Fjenkins.mydomain%252Fmanage%253F

Breve resumo:

Quando você olha para este URL:   /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

O que temos é: /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/<parameter1>

em que <parameter1> = https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

Os caracteres de barra em <parameter1> são codificados para que o Jenkins saiba o que é parte do path e o que é <parameter1> .

Isso significa que, quando o URL Rewrite Decodifica o URL, <parameter1> é misturado com o restante do path .

O resultado desejado é obter a URL exatamente como o navegador a enviou, mas apontando para o localhost:

http://localhost:8080/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

Existe alguma maneira de desabilitar as operações de Decodificação / Codificação que o URL Rewrite Module está fazendo?

PS: encontrei uma postagem no blog sobre os recursos da URL Rewrite v2.1 e diz que há um novo sinalizador que pode ser usado para desabilitar esse comportamento, mas não faço ideia de como ou onde configurá-lo.

In URL Rewrite versions prior to v7.1.1980, when one tries to use UNENCODED_URL, URL Rewrite will encode it which may lead to double encoding if the original URL was already encoded This is in violation of section 2.4 of RFC3986, which says "Implementations must not percent-encode or decode the same string more than once, as decoding an already decoded string might lead to misinterpreting a percent data octet as the beginning of a percent-encoding, or vice versa in the case of percent-encoding an already percent-encoded string." It also made the use of UNENCODED_URL impractical, especially in reverse forwarder scenarios with ARR where the backend servers expect the URL to be passed unmodified.

In v7.1.1980, we are adding a feature flag, useOriginalURLEncoding that allows you to turn off this non-compliant URL Encoding when set to true. The default behavior will remain unchanged (useOriginalURLEncoding is true by default).

Alguém aqui tem alguma ideia de como fazer isso?

    
por Jorge Martins 06.11.2017 / 20:49

1 resposta

0

Consegui corrigir o problema, definindo useOriginalURLEncoding = false descrito na postagem mencionada na pergunta.

Para definir o sinalizador como IIS Manager , selecione Configuration Editor e vá para a seção system.webServer/rewrite/rules , onde você encontrará o sinal useOriginalURLEncoding .

Defina o sinalizador como falso, e o URL Rewrite não codificará mais os URLs ao usar a variável {UNENCODED_URL} nas regras.

    
por 07.11.2017 / 17:40