Проблема двойного кодирования IIS10 URL Rewrite 2.1

Jorge Martins спросил: 13 октября 2017 в 07:42 в: iis

У меня есть сервер IIS10 с ARR 3.0 и модулем перезаписи URL 2.1, который действует как обратный прокси-сервер для нескольких других веб-серверов. Другие серверы работают на разных портах, поэтому сервер IIS10 предоставляет "дружественные URL-адреса" на порт 80. Перезапись URL-адресов используется для передачи запроса на внутренний сервер.

Одним из таких серверов является Jenkins.

У Дженкинса есть предупреждающее сообщение, сообщающее, правильно ли настроен обратный прокси-сервер (подробнее здесь), и это предупреждающее сообщение помогло мне найти проблему в моем обратном прокси-сервере.

проблема заключается в том, что URL Rewrite декодирует и кодирует мои URL таким образом, что к моменту их обращения к Jenkins они будут отличаться от того, что запрашивал браузер.

Пример:

Правило перезаписи 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>

При отправке следующего URL:

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

я заметил, что закодированные символы, где правило декодируется перед триггером делая {R: 1} похожим на это: /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https:/jenkins.mydomain/manage/

После некоторых исследований я узнал, что я мог использовать {UNENCODED_URL} вместо {R: 1}, чтобы получить строку запроса перед декодированием, поэтому я скорректировал свое действие правила:

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

К сожалению, при перезаписи URL Rewrite снова кодирует URL после того, как перезаписал полученный от Jenkins URL:

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

Краткое резюме:

Когда вы посмотрите на этот URL: /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

Что у нас есть : /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/<parameter1>

где <parameter1> = https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

Косая черта в <parameter1> закодирована, чтобы Дженкинс мог знать, что часть path и что такое <parameter1>.

Это означает, что, когда перезапись URL декодирует URL, <parameter1> смешивается с остальная часть path.

Желаемый результат - получить URL-адрес в точности так, как его отправил браузер, но указав на локальный хост:

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

Есть ли способ отключить операции декодирования / кодирования, которые выполняет модуль перезаписи URL?

PS: я нашел сообщение в блоге относительно URL Rewrite v2.1 featur Да, и это говорит о том, что есть новый флаг, который можно использовать, чтобы отключить это поведение, но я понятия не имею, как и где его установить.

В версиях перезаписи URL до v7 .1.1980, когда кто-то пытается использовать UNENCODED_URL, URL Rewrite закодирует его, что может привести к двойному кодированию, если исходный URL уже был закодирован. Это является нарушением раздела 2.4 RFC3986, который гласит: "Реализации не должны кодировать или декодировать одну и ту же строку более чем однажды, поскольку декодирование уже декодированной строки может привести к неправильной интерпретации процента данных в качестве начала кодирования процента, или наоборот, в случае процентного кодирования строки, уже закодированной в процентах ". Это также сделало использование UNENCODED_URL непрактичным, особенно в сценариях обратного перенаправления с ARR, где серверы ожидают, что URL будет передан без изменений.

В v7.1.1980 мы добавляем флаг функции, используйтеOriginalURLEncoding, который позволяет отключить это несовместимое кодирование URL, когда установлено значение true. Поведение по умолчанию останется неизменным (useOriginalURLEncoding по умолчанию имеет значение true).

Кто-нибудь здесь знает, как это сделать?

0 ответов