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

IIS не устанавливает X-FORWARDED-HOST

У меня есть сервер IIS [на WinServer 2016], который действует как обратный прокси для нескольких веб-серверов Kestrel. Прямо сейчас я пытаюсь настроить IIS для пересылки всех заголовков X-Forwarded- *. Для заголовков X-Forwarded-For и X-Forwarded-Proto все работает нормально, но не для X-Forwarded-Host.

Вот «Разрешенные серверные переменные» на уровне сервера:

Вот что я вижу в отладчике, когда HTTP-запрос попадает на веб-сервер Kestrel.

К сожалению, я не могу создать дамп с серверов PROD, но поскольку некоторые функции не работают должным образом, ситуация должна быть аналогична среде DEV.

Прочитав несколько статей о том, как настроить IIS в качестве обратного прокси, у меня сложилось впечатление, что все заголовки X-Forwarded- * должны добавляться автоматически. Или XFH - исключение, и мне нужно установить его вручную?

Буду очень признателен за любую помощь!

Мне потребовалось время, чтобы понять. Есть некоторые странности в том, как IIS работает со своими серверными переменными, см. Ниже:

  1. Вы должны определить переменную в графическом интерфейсе InetMgr, я обнаружил, что при попытке указать только с помощью web.config сервер будет возвращать 500 внутренних ошибок сервера, пока он не будет добавлен. (Вы уже сделали это, поэтому здесь нечего менять.)

  2. Для каждого запроса должно быть присвоено значение динамическое или статическое. Это предварительно указано в файле web.config:

Код с разметкой и подсветкой синтаксиса

Если вы хотите скопировать и вставить:

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http:/example.com/{R:1}" />
                    <serverVariables>
                        <set name="ORIGINAL_HOST20" value="{HTTP_HOST}" />
                        <set name="HTTP_X_FORWARDED_PROTO" value="https" />
                        <set name="HTTP_X_FORWARDED_PORT" value="443" />
                        <set name="HTTP_X_FORWARDED_HOST" value="example.com" />
                    </serverVariables>
                </rule>
            </rules>
    </rewrite>
    <httpErrors errorMode="DetailedLocalOnly" />
    <directoryBrowse enabled="false" />
</system.webServer>

Надеюсь это поможет!

Я наконец понял это из проблемы GitHub. Я пытался установить оба X-Forwarded-Host и Host заголовок и не мог заставить ни работать:

Из https://github.com/maptiler/tileserver-gl/issues/119

Обходной путь в IIS - заставить IIS не изменять заголовок Host.

\Windows\System32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost

Вы также можете сделать это из пользовательского интерфейса:

Установка system.webServer / proxy preserveHostHeader на True

Как только я установил это и перезапустил сервер, переменные были установлены правильно, и приложение Flask, которое я использовал для обратного проксирования, перенаправляло на правильный URL (вместо localhost:8050).

Надеюсь, это кому-то поможет. Я потратил бесчисленные часы, пытаясь заставить это работать.