次の方法で共有


IIS 7.0 以降のバージョンでホストされている Web サイトにアクセスするときのエラー メッセージ: HTTP エラー 404.17 - 見つかりません

この記事は、HTTP エラー 404.17 - 見つかりません インターネット インフォメーション サービス (IIS) 7.0 以降のバージョンでホストされている Web サイトにアクセスするときの問題を解決するのに役立ちます。

元の製品バージョン: インターネット インフォメーション サービス
元の KB 番号: 2019689

現象

IIS 7.0 以降のバージョンでホストされている Web サイトがある。 Web ブラウザーを使用して Web サイト内の動的コンテンツを参照すると、次のようなエラー メッセージが表示されることがあります。

Error Summary (エラーの概要)
HTTP エラー 404.17 - 見つかりません
要求されたコンテンツはスクリプトであり、静的ファイル ハンドラーで処理されない可能性があります。
詳細なエラー情報:

モジュール StaticFileModule
Notification ExecuteRequestHandler
Handler StaticFile
エラー コードの0x80070032

要求された URL http://iisserver:80/page.aspx
物理パス C:\inetpub\wwwroot\page.aspx
Logon メソッド Anonymous
ログオン ユーザー匿名

原因

このエラーは、要求を処理するように構成された HTTP ハンドラーに特定の前提条件が設定されていますが、そのアプリケーション プールがこれらの前提条件の一部またはすべてを満たしていないために発生します。 これにより、代わりに静的ファイル ハンドラーが要求の処理に使用されます。 その後、要求の処理が失敗し、 404.17 状態が返されます。これは、要求が静的リソースではなく動的リソースを対象としているためです。

たとえば、次のハンドラー マッピングを考えてみましょう。

<add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />

この場合、サイトから要求されている *.aspx リソースが、Classic モードで実行されていないアプリケーション プールで処理されている場合、または .NET Framework の 2.0 バージョンを実行していない場合は、404.17 エラーが返されます。 この例でリソースを正しく提供するには、3 つの事前条件がすべて満たされている必要があります。 具体的には、このリソースをホストするアプリケーション プールを Classic モード用に構成する必要があります。.NET Framework の 2.0 バージョンを使用するように構成する必要があり、32 ビット アプリケーション用に設定する必要があります。

解決方法

この問題を解決するには、ハンドラーに設定されているすべての事前条件を満たすように、アプリケーションをホストするアプリケーション プールを構成します。

  1. IIS マネージャーを開く

  2. コンピューター名を展開し、左側のウィンドウ [アプリケーション プール をクリックします。

  3. 中央のウィンドウで、リソースをホストしているアプリケーション プールを強調表示します。

  4. 右端のウィンドウで、[ Advanced Settings...

  5. [Advanced settings dialog under the category (General)] で、ハンドラーの要件に合わせて次の設定を構成します。

    • .NET Framework のバージョン
    • 32 ビット アプリケーションを有効にする
    • マネージド パイプライン モード

詳細

このセクションの情報は、エラーで説明されている Web サイトとアプリケーションに対して構成されているハンドラーを特定し、そのハンドラー用に構成されている事前条件を特定するのに役立ちます。

Appcmd.exe コマンド

次のコマンドを使用して、エラーの出力に記載されている Web サイト用に構成されたハンドラーを識別できます。

アプリケーション プールを一覧表示する

次のコマンドは、アプリケーションが実行されているアプリケーション プールを特定し、そのアプリケーション プール用に構成された前提条件を一覧表示する方法を示しています。

C:\Windows\System32\inetsrv>appcmd.exe list apps /site.name:"Default Web Site"
APP "Default Web Site/" (applicationPool:DefaultAppPool)

C:\Windows\System32\inetsrv>appcmd.exe list apppools
APPPOOL "DefaultAppPool" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)

ハンドラーを一覧表示する

このコマンドは、既定の Web サイトで特定のアプリケーション用に構成されたハンドラーを出力します。

C:\Windows\System32\inetsrv>appcmd.exe list config "Default Web Site/application" -section:handlers
<system.webServer>
  <handlers accessPolicy="Read, Script">
    <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
  </handlers>
</system.webServer>

ASP.NET の場合、*.aspx リソース用に多数のハンドラーが構成されている可能性があります。 場合によっては、アプリケーションが実行されているアプリケーション プールに合わせてハンドラーを変更する必要がある場合があります。 以下は、さまざまな事前条件設定を持つさまざまな ASP.NET 2.0 ハンドラーの一覧です。

  • ASP.NET 2.0 統合モード 32/64 ビット ハンドラー

    <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
         type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />
    
  • ASP.NET 2.0 クラシック モード 32 ビット ハンドラー

    <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" 
        scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" 
        responseBufferLimit="0" />
    
  • ASP.NET 2.0 クラシック モード 64 ビット ハンドラー

    <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
         modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" 
         preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
    

再現手順

  1. 2 つのファイルを含むディレクトリを作成します。

    • コンテンツをTest.aspx する <%Response.Write("Hello World")%>

    • コンテンツを含む Web.config :

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <system.webServer>
              <httpRedirect enabled="false" destination="http://TestSite" exactDestination="false" childOnly="false" httpResponseStatus="Permanent" />
              <security>
              </security>
              <handlers>
                  <clear/>
                  <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
                  <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
              </handlers>
          </system.webServer>
          <system.web>
              <authentication mode="Windows">
                  <forms cookieless="UseCookies" />
              </authentication>
          </system.web>
      </configuration>
      
  2. これら 2 つのファイルを含むディレクトリを指す IIS 7.0 以降のバージョンのアプリケーションを作成します。

  3. 統合モード用に構成されたアプリケーション プールで実行するように新しいアプリケーションを構成します。

  4. test.aspxに移動します。