適用先
Windows 10 Windows 10, version 1511, all editions Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Standard Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows 8.1 Enterprise Windows 8.1 Pro Windows 8.1 Windows RT 8.1 Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Standard Windows Server 2012 Standard Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Datacenter Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Standard Windows Server 2008 R2 Web Edition Windows Server 2008 R2 Foundation Windows 7 Service Pack 1 Windows 7 Ultimate Windows 7 Enterprise Windows 7 Professional Windows 7 Home Premium Windows 7 Home Basic Windows 7 Starter Windows Server 2008 Service Pack 2 Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Server 2008 Foundation Windows Server 2008 for Itanium-Based Systems Windows Vista Service Pack 2 Windows Vista Ultimate Windows Vista Enterprise Windows Vista Business Windows Vista Home Premium Windows Vista Home Basic Windows Vista Starter

現象

リクエストをリダイレクトするのに特定のライブラリを使用する、実行可能なプログラムをホストしているIIS Common Gateway Interface (CGI)フィーチャーを使用する際、"PROXY" リクエストヘッダーが存在することによってリクエストが正常に行われない可能性があります。複数のウェブアプリケーションプラットフォームがこのライブラリを使用することが知られています。これにはPHP、Python、Go、そしてその他が含まれます。

原因

CGIはウェブサーバーが実行可能なプロセスとして実行するアプリケーションをホストできるようになるインターフェースです。ウェブサーバーによってリクエストが受信された場合、サーバーはその単一のリクエストを処理するための新しいプロセスを開始します。リクエストが完了したとき、プロセスは終了します。プロセスがリクエストデータへのアクセスを得るために、名前の先頭に"HTTP_"が追加されたリクエストヘッダーが環境変数として含まれています。よって、"Proxy"と名前がつけられたヘッダーを含むリクエストのCGIプロセスは、リクエストヘッダーと同じ値を持つ"HTTP_PROXY"環境変数を含みます。cURLコマンドラインとライブラリを用いると多くの種類のアプリケーションがウェブサーバーを含む多くの種類のサーバーにリクエストを行うことができるようになるので、一般的に使用されています。ライブラリコマンドラインパラメータ―を使用して構成することができます。またはホストプロセス環境変数から構成パラメーターを読み込むことができます。"HTTP_PROXY"はcURLで使用される多くの構成パラメーターの一つです。"HTTP_PROXY"は構成されたプロキシを通じてHTTPリクエストを送信するために、cURLで使用されます。 注意これはクライアントリクエストヘッダーの表示としての"HTTP_PROXY"とは関連がありません。CGIプロセス内でcURLがホストされて、そのプロセスが"HTTP_PROXY"と名付けられた環境変数を含む場合、cURLは環境変数によって値が特定されているHTTPプロキシを介してリクエストデータを送信するためにその値を使用します。これはcURLが"HTTP_PROXY"が構成ディレクティブであってクライエントリクエストヘッダーでないと予想することから発生します。

回避策

この問題を回避するには、CGIをIISを実行中のサーバーで使用しないでください。CGIは基本的にobsoleteインターフェースであり、新しくてよりパフォーマンスに直結するインターフェースに代替されます。PHP、Python、そしてGoはIIS上でFastCGIを介してホストしてください。FastCGIはクライアントリクエストヘッダーに環境変数を使用しないので、この問題は発生しません。しかしPHPに関しては、いくつかのアプリケーションが環境変数を検出するためにPHPのgetenv()機能を使用する可能性があります。CGIプロセス内でPHPがホストされてない場合でも、リクエストヘッダー値をgetenv()機能に使用可能なデータセットに注入することでCGIの行動を複製します。HTTP_PROXYをこの方法で検出するPHPを使用する場合、次のヘッダー値のクリアの緩和またはPROXYヘッダーを用いたリクエストの拒否が効果的です。何らかの理由でCGIを使用しなければならない場合、"Proxy"と名付けられたリクエストヘッダーを含むリクエストをブロックするか、ヘッダーの値をクリアしてください。これは"Proxy"がスタンダードなリクエストヘッダーネームではなく、ブラウザが基本的にそれを送信しないからです。プロキシヘッダー(望ましいソリューション)を含むリクエストブロックするためには、以下のコマンドラインを実行してください。

appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='proxy',sizelimit='0']注意appcmd.exeは、一般的にはパス内に存在せず%systemroot%\system32\inetsrvディレクトリで発見することができます。ヘッダーの値をクリアするためには、以下のURLのリライトルールを使用することができます。

<system.webServer>    <rewrite>        <rules>            <rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">                <match url="*.*" />                <serverVariables>                    <set name="HTTP_PROXY" value="" />                </serverVariables>                <action type="None" />            </rule>        </rules>    </rewrite></system.webServer>

注意URLリライトはIISでダウンロード可能なアドインで、IISインストールのデフォルトには含まれていません。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。