Я пытаюсь создать обратный прокси-сервер, который перезапишет все запросы на определенный URL-адрес на другой сервер внутри DMZ. Я получил настройку и конфигурацию, основанную на этой статье 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
не найден!
Трассировка с использованием журналов неудачных запросов, я вижу, что правила работают отлично (новый 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, где мы должны сопоставлять имена подкаталогов / виртуальных каталогов между источником и прокси, или мои правила неадекватны?
Существует недокументированная проблема с 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-dealing-with-500-52-status- коды / вокруг GZIP