web-dev-qa-db-ja.com

IISはX-FORWARDED-HOSTを設定しません

いくつかのKestrel Webサーバーのリバースプロキシとして機能するIISサーバー[WinServer 2016]]を使用しています。現在、IIS toすべてのX-Forwarded- *ヘッダーを転送します。X-Forwarded-ForおよびX-Forwarded-Protoヘッダーの場合、すべて正常に機能しますが、X-Forwarded-Hostには機能しません。

サーバーレベルの「許可されたサーバー変数」は次のとおりです。

Allowed Server Variables

HTTPリクエストがKestrelウェブサーバーにヒットしたときのデバッガーの表示は次のとおりです

HTTP headers

残念ながら、PRODサーバーからダンプを作成することはできませんが、いくつかの機能が適切に機能していないため、状況はDEV環境に似ているはずです。

IISをリバースプロキシとして設定する方法に関するいくつかの記事を読んだ後、すべてのX-Forwarded- *ヘッダーを自動的に追加する必要があるという印象を受けました。または、XFHは例外であり、手動で設定するには?

どうぞよろしくお願いします!

7

これを理解するには少し時間がかかりました。 IISがサーバー変数を処理する方法にはいくつかの奇妙な点があります。以下を参照してください:

  1. InetMgr GUIで変数を定義する必要があります。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>

お役に立てれば!

2
Rogue

私はこれを最終的にGitHubの問題から見つけました。 X-Forwarded-HostHostヘッダーの両方を設定しようとしていましたが、どちらも機能しませんでした。

https://github.com/maptiler/tileserver-gl/issues/119 から

IISでのこれの回避策は、ホストヘッダーを変更しないようにIISを強制することです。

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

UIからこれを行うこともできます。

system.webServer/proxy preserveHostHeaderをTrueに設定

これを設定してサーバーを再起動するとすぐに、変数が正しく設定され、Flask私がリバースプロキシを行っていたアプリが(localhost:8050ではなく)正しいURLにリダイレクトされていました)。

これが誰かを助けることを願っています。私はこれを機能させるために数え切れないほどの時間を費やしました。