Я пытаюсь создать обратный прокси, который перепишет все запросы к конкретному URL к другому серверу в демилитаризованной зоне. Я получил настройки и конфигурацию, работающую на основе этой статьи https://learn.iis.net/page.aspx/659/reverse-proxy-with-url-rewrite-v2-and-application-request-routing
Таким образом, моя основная установка похожа на это -
Базовый URL, который должен инициировать, переписывает - http://MySite/Custom?Data=123
URL прокси - http://MyProxyServer/Service?Data=123
Моя проблема с двумя ПОЛУЖИРНЫМИ ключевыми словами выше! Я просто, может казаться, успешно не переписываю все запросы к новому URL.
Объяснение подробно -
Когда я использую следующее правило -
<rule name="ReverseProxy" stopProcessing="true">
<match url="Custom/(.*)" />
<action type="Rewrite" url="http://MyProxyServer/Service{R:1}" />
</rule>
Я получаю 404 ошибки при высказывании http://MySite/Service
не найденный!
Трассировка использования привела журналы req к сбою, я вижу правила работать отлично (новый URL создается правильно), но в конечном счете концы запроса с 404 ошибками.
Вещь, если я немного настраиваю правило, все хорошо работает.
Следующие работы правила -
<rule name="ReverseProxy" stopProcessing="true">
<match url="Service/(.*)" />
<action type="Rewrite" url="http://MyProxyServer/Service{R:1}" />
</rule>
Но я должен изменить свой базовый URL на http://MySite/Service?Data=123
от http://MySite/Custom?Data=123
Так существует ли ограничение с обратной реализацией прокси в IIS 7, где мы должны соответствовать sub названиям каталога/виртуального каталога между источником и проксировать, или действительно ли мои правила являются несоответствующими?
Существует недокументированная проблема с ARR / rewrite , где он не может отображать вложенные папки. Я добавляю это для справки и надеюсь, что это поможет другим.
Обходной путь, который я пробовал, который кажется эффективным, заключается в создании папки внутри исходного веб-приложения, добавлении web.config в эту папку с правилами, указывающими на целевое веб-приложение:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://<<<TARGET_HOSTNAME>>>{R:1}" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
</rules>
<outboundRules>
<rule name="RestoreAcceptEncoding" preCondition="RestoreAcceptEncoding">
<match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)$" />
<action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
</rule>
<preConditions>
<preCondition name="RestoreAcceptEncoding">
<add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".*" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
Также добавлены инструкции из https://blogs.msdn.microsoft.com/friis/2016/08/25/iis-with-url-rewrite-as-a-reverse-proxy -part-2-deal-with-500-52-status-codes / вокруг GZIP