web-dev-qa-db-ja.com

IIS 7.5不明なホスト名に対して404を返す

これは私には正しくないように思われるので、IISをどのように誤って構成したかを教えてくれる人を探しています...構成はIIS7.5(2008R2)で、SP1はありません。

IIS 7.5がいくつかのサイトで構成されています。すべてのサイトのバインディングにホスト名が定義されているため、ホスト名のないサイトはありません。ただし、サーバーに不明なホスト名を要求した場合= IIS(技術的にはMicrosoft-HTTPAPI/2.0)は、400エラーではなく404エラーを返します。低い404ではなく400(またはその他の主要なエラー)が予想されます。

これは、複数のIISの前にnginxがあり、サイトを停止してnginxがローテーションから外す場合に問題を引き起こします。 IISは、その名前のアクティブなサイトがない場合でも、リクエストに対して404を返すため、nginxはサーバーが停止していることを認識しません。

注意:IISは、サーバーがあるかどうかに関係なく404を返しますが、サーバーが停止しているか、サーバーがありません。

考え?ソリューション?

-追加情報:OK、80(5000)以外のポートにサイトを追加し、そのポートへの接続で存在しないサイトを要求すると、予期されるエラー400(無効なホスト名)が表示されます。したがって、IISはポート80で汎用(ホスト名なし)接続をリッスンしていませんが、何かがあるように見えます。HTTPSysにリッスンしているもののリストをダンプさせる方法についてのアイデア?

5
WaldenL

これは仕様によるものです。 URL予約はURL登録と同じではありません。これは、アプリケーションがHTTP.SYSに登録してリッスンするときに動的に発生します。 URL予約の場合、HTTP.SYSは、特定の予約のURLが一時的に利用できないだけなのか、まったく存在しないのかを認識しません。この場合にわかるのは、有効なホスト名の一致(ワイルドカードが強い/弱いため)があるが、URLパスが現在登録されているリスナーと一致しないことだけです。

400または503の応答が必要な場合は、URL予約を使用しないか、ワイルドカードを含まない明示的なURL予約を使用してください。つまり、URLのプレフィックスを任意の予約(登録を介して作成された動的なものを含む)と一致するようにHTTP.SYSを構成すると、リスニングアプリケーションにリクエストが配信されます(残りは一致します)、またはアクティブな登録済みリスナーが見つからない場合は404を返します。

より簡単な別の解決策は、IISサービス自体を使用して503の送信を管理することです。これを行うには、サイトを停止せず、代わりにそれに関連付けられたアプリケーションプールを停止します。 。これにより、HTTP.SYSで完全修飾一致が発生します(wlidcard URL予約がある場合でも)が、要求を配信するAppPoolがないため、503になります。

2
jwp

OK、MSテクニカルサポートとの「楽しい」数時間後、これがバグであるかどうかについては同意していませんが、問題は「 http: // + 5000/Temporary_Listen_Address / "これはWCFによって追加されます。

次の形式でサイトのより具体的なurlaclを追加する場合の「回避策」として:netsh http add urlacl url = http:// hostname:80 / user = networkservice listen = yesデリゲート= yes

そうすると、404ではなく503が返されます。これは「バグ」であり、MSは「チェック」しています(息を止めていません)。

これに当たった人にとって、問題番号はREG:112060473529066です。

1
WaldenL

アクティブなHTTPモジュールがIISインスタンスにインストールされていますか?

または、デフォルトのWebサイト(標準のIISインストール)がアクティブ/実行中)を停止し、そこでisは空のバインディングです。

デフォルトのWebサイトの標準バインディングは空白です。これは、すべてのHTTPホストヘッダーを受け入れることを意味します。

1
splattne

OK、それを理解しました(しかし、それはバグだと思います。後でMSに報告する必要があります)。 「netshhttpshow urlacl」を使用してHTTPSys用にリストされたURLACLを見ると、「 http:// +:80/Temporary_Listen_Address / "」の登録が表示されます。これは私が送信しているリクエストと一致しないはずですが、一致しているようです。 UrlPrefixのドキュメントによると、一致しませんが、私のテストによると一致します。

ポート5000で新しいサイトを作成したとき、temporary_listen_addressの登録がなく、すべて期待どおりに機能していました。ポート5000で2つのサイト(異なるホストヘッダー)が実行されている場合、停止したサイトのリクエストはエラー400を返します。ただし、「 http:// +:5000 /」のurlacl(netsh http add urlacl)を登録するとtest / "そして、そのurlプレフィックスと一致しないものをリクエストすると、404が返されます。登録を削除すると、再び400が返されます。

私は一般的にHTTPSysが好きですが、それを掘り下げると非常に複雑になります。 MSの応答を後で更新します。 connect.Microsoft.comに報告する場所がないので、電話する必要があります。

0
WaldenL