Обратный прокси-сервер IIS для указания URL-адреса c - ошибка модуля перезаписи URL - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть одна служба windows, которая выполняет какое-то приложение с конечной точкой REST на локальном хосте: 5001 / api / ... Поэтому я установил IIS 10 с модулем перезаписи, чтобы создать обратный прокси-сервер для HTTPS для этой службы. Это сработало замечательно.

Теперь я хочу использовать тот же сайт IIS для размещения сайта, который должен использовать этот сервис по тому же URL. Поэтому я попытался изменить шаблон моего URL для перезаписи iis на «api /(.*)», поэтому он должен просто прокси-запросы / api. Тестирование шаблона - это именно то, что я хочу: просмотр соответствий server.domain / api / function и перезапись выполнены, а server.domain не переписан. Но теперь просмотр server.domain будет часто возвращать «Ошибка HTTP 500.52 - Ошибка модуля перезаписи URL». Иногда загрузка страницы работает отлично. Но после перезагрузки я снова получу эту ошибку.

Мой web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <outboundRules>
                <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1" enabled="true">
                    <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:5001/(.*)" />
                    <action type="Rewrite" value="https://server.domain/{R:2}" />
                </rule>
                <rule name="ReverseProxyOutboundRule2" preCondition="ResponseIsHtml1" enabled="true">
                    <match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:5001/(.*)" />
                    <action type="Rewrite" value="https://server.domain/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
            <rules>
                <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
                    <match url="api/(.*)" />
                    <action type="Rewrite" url="http://localhost:5001/{R:0}" logRewrittenUrl="true" />
                </rule>
            </rules>
        </rewrite>
        <security>
            <requestFiltering allowDoubleEscaping="true" />
        </security>
        <httpErrors errorMode="Detailed" />
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, DELETE, PUT" />
                <add name="Access-Control-Max-Age" value="1000" />
                <add name="Access-Control-Allow-Headers" value="x-requested-with, Content-Type, origin, authorization, accept, client-security-token" />
            </customHeaders>
        </httpProtocol>
        <urlCompression doDynamicCompression="false" />
    </system.webServer>
</configuration>

Я понятия не имею, почему существуют два исходящих правила. IIS создал их автоматически, когда я решил создать правила обратного прокси.

Если я отключу сжатие содержимого stati c, все будет работать без проблем. Dynami c модуль сжатия не установлен .

Итак, у меня несколько вопросов: - почему я получаю ошибку «Перезаписать URL» для страниц, которые не следует переписывать, а переписанные будут работать без проблем - почему сжатие stati c создает URL перезаписи ошибки - как мне настроить IIS для сжатия и работы с перезаписью (я проверил порядок модулей и модуль сжатия stati c находится над модулем перезаписи).

Best, Robin

1 Ответ

0 голосов
/ 17 апреля 2020

Создано ли правило обратного прокси с использованием шаблона правила перезаписи URL? Если это так, вы можете включить исходящие правила. Эти исходящие правила в основном используются, когда клиент не может получить доступ к исходному файлу за сервером DMZ. Если ваш клиент может получить доступ к домену на внутреннем сервере, вам не нужны эти исходящие правила.

Причиной ошибки IIS return 500.52 является то, что IIS не может применить исходящее правило для зашифрованного тела ответа от backend server.

Так что вам нужно либо отключить httpcompression, либо перезаписать входящий заголовок accept-encoding.

Боюсь, что невозможно заставить работать httpcompression и исходящее правило бок о бок, потому что переписать модуль не может перезаписать сжатый объект.

https://docs.microsoft.com/zh-cn/archive/blogs/friis/iis-with-url-rewrite-as-a-reverse-proxy-part-2-dealing-with-500-52-status-codes

...