Назад | Перейти на главную страницу

Обратный прокси - должен ли виртуальный каталог / подпапки соответствовать правилам перезаписи

Я пытаюсь создать обратный прокси-сервер, который перезапишет все запросы на определенный 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