Ошибка HTTP 401 только при использовании прокси-сервера IIS ARR

Приложение, содержащее веб-интерфейс, работает в системе Windows Server 2019 с установленными IIS 10 и ARR. При переходе на веб-страницу с использованием IP: порт веб-страница загружается правильно. При переходе на веб-страницу с помощью domain.com на веб-сайте есть контент, который показывает ошибку 401 в консоли, и страница загружается некорректно.

Консоль Chrome

При переходе в домен запрос проходит через IIS и URL Rewrite. Казалось бы, существует некоторая проблема с передачей информации через прокси.

Это код правила перезаписи в IIS:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:33337/{R:1}" />
                <serverVariables>
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:33337\/?(.*)" />
                    <action type="Rewrite" value="http{R:1}://sub.domain.com/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
        <urlCompression doStaticCompression="false" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />
    </system.webServer>
</configuration>

Это ссылка на проблему GitHub для этой конкретной проблемы: https://github.com/qbittorrent/qBittorrent/issues/11207


person Pie    schedule 28.09.2019    source источник


Ответы (1)


Я воспроизвел проблему.

Очевидно qBittorrent ожидает, что клиенты отправят заголовки Referer того же происхождения. В вашем случае это должно быть localhost:33337, но очевидно, что sub.domain.com отправляется.

Эта мера безопасности активируется настройкой Enable Cross-Site Request Forgery (CSRF) protection, доступной через qBitorrent > Options > Web UI > Security.

У вас есть два варианта решения.

  • Отключите настройку.
  • Перепишите заголовок Referer с соответствующим значением.

Если вы хотите переписать заголовок, после разрешения серверных переменных HTTP_REFERER и HTTP_ORIGIN, как вы это делали для HTTP_ACCEPT_ENCODING, вам следует изменить свои правила следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://localhost:33337/{R:1}" />                    

                    <!-- New Optional Condition -->
                    <conditions logicalGrouping="MatchAny">
                        <add input="{HTTP_REFERER}" pattern="^(?:https?://[^/]*/(.*))?$" />
                    </conditions>

                    <serverVariables>
                        <set name="HTTP_ACCEPT_ENCODING" value="" />

                        <!-- New Header Rewrite -->
                        <set name="HTTP_REFERER" value="http://localhost:33337/{C:1}" />

                        <!-- Remove Origin Header -->
                        <set name="HTTP_ORIGIN" value="" />
                    </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:33337\/?(.*)" />
                    <action type="Rewrite" value="http{R:1}://sub.domain.com/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
        <urlCompression doStaticCompression="false" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />
    </system.webServer>
</configuration>

Кстати, имейте в виду, что qBittorrent предупреждает вас о проблеме. Не забудьте проверить вкладку «Журнал выполнения».

Журнал выполнения qBittorrent

person Kul-Tigin    schedule 29.09.2019
comment
Отличный подробный ответ и ценю два разных решения! - person Pie; 30.09.2019
comment
Я рад, что смог помочь @Pie - person Kul-Tigin; 30.09.2019