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

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

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

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

Проблема в эта функция переопределения URL-адресов декодирует и кодирует мои 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} , чтобы получить строку запроса перед декодированием, поэтому я скорректировал действие правила:

К сожалению, перезапись URL-адреса снова кодирует URL-адрес после моей перезаписи, в результате чего 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/

, где = https% 3A% 2F% 2Fjenkins.mydomain% 2Fmanage% 119 slash [1224 символов] ] <параметр1> закодированы таким образом, чтобы Дженкинс мог знать, что является частью пути , а что такое <параметр1> .

Это означает, что при перезаписи URL Декодирует URL-адрес, смешивается с остальной частью пути .

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

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

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

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

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

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

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

1
задан 7 November 2017 в 17:54
1 ответ

Ich konnte das Problem beheben, indem ich useOriginalURLEncoding = false setzte, wie in dem Beitrag beschrieben, auf den ich in der Frage verwiesen habe.

Um das Flag auf IIS Manager zu setzen, wählen Sie Konfigurationseditor und gehen Sie zum Abschnitt system.webServer / rewrite / rules , wo Sie das Flag useOriginalURLEncoding finden.

Setzen Sie das Flag auf false. und URL Rewrite codiert die URLs nicht mehr, wenn die Variable {UNENCODED_URL} in den Regeln verwendet wird.

0
ответ дан 4 December 2019 в 04:27

Теги

Похожие вопросы