Windows Server 2008 上の IIS 7 に ASP.NET 4 Web サイトを展開しました。ルート フォルダーまたはサイト内の他のフォルダーを参照すると、サーバーはDefault.aspx
期待どおりに既定のページを配信して応答します。ただし、.aspx
拡張子を持つ特定のページを要求すると、404 エラーが発生します。
たとえば、次のようにリクエストするとします。
http://localhost/MyWeb/
サーバーは正常に配信しますhttp://localhost/MyWeb/Default.aspx
。ただし、明示的に要求すると:
http://localhost/MyWeb/Default.aspx
IIS は 404 エラーで応答します。
エラーの詳細は次のとおりです。
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error code: 0x80070002
デフォルトのページにアクセスできることから、.NET フレームワークは明らかにインストールされ、動作しています。ところで、サーバーが失敗して 404 エラー ページが表示されると、入力した URL ( などhttp://localhost/MyWeb/Default.aspx
) の拡張子が削除され ( と読み取られるhttp://localhost/MyWeb/Default
) ることがわかりました。
aspnet_iisreg -i
サーバーを実行して再起動してみましたが、状況は変わりませんでした。
何が足りないのでしょうか? ありがとうございます。
更新。ここに私のサイトの を投稿しますweb.config
。これに適用される他の構成ファイルはありません。
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<appSettings>
<add key="DatabaseServer" value="CONWAY\SQLEXPRESS"/>
<add key="DatabaseName" value="KaleidoScape"/>
<add key="User" value="KaleidoScapeUser"/>
<add key="Password" value="Scape1!"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.6.1" />
<httpRuntime targetFramework="4.6.1" />
<pages>
<namespaces>
<add namespace="System.Web.Optimization" />
</namespaces>
<controls>
<add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" />
<add tagPrefix="uc" tagName="FileGallery" src="~/Controls/FileGallery/FileGallery.ascx" />
</controls>
</pages>
<authentication mode="Forms">
<forms defaultUrl="~/App" loginUrl="~/Default.aspx" slidingExpiration="true" timeout="120" name="Incipit.KaleidoScape" />
</authentication>
<authorization>
<allow users="*" />
</authorization>
</system.web>
<location path="App">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
</configuration>
更新。失敗した要求の IIS ログ エントリは次のとおりです。
2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage.aspx - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 301 0 0 46
2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 404 0 2 0
エントリが 2 つあることに注意してください。最初のエントリは に対応しておりMyPage.aspx
、これは URL フィールドに入力して要求したページです。この結果、301 (恒久的に移動) エラーが発生します。その直後に、拡張子のない同じページのエントリがあり.aspx
、サブステータス 0 の 404 エラーが発生します。完全な URL で 301 が返される理由と、サーバーが拡張子のないページを配信しようとする (そして失敗する) 理由がわかりません。
更新。興味深い実験をしました。サーバー上に、1 つのTest.aspx
ファイルを持つ新しい Web アプリケーションを作成しました。期待どおりに動作しました。つまり、明示的に要求すると、サーバーがページを配信します。その後、問題となっている Web サイトのコンテンツをすべてコピーしたところ、Test.aspx
動作しなくなりました。その後、この Web からファイル以外のすべてを削除しましたTest.aspx
が、動作は回復せず、失敗し続けました。結論として、Web コンテンツに問題を引き起こす何かがあり、コンテンツを削除した後もそれが残っています。これは、Bootstrap とその他のいくつかのものを含むプロジェクト テンプレートを使用して Visual Studio 2015 で作成した Web サイトです。まったく困惑しています。
答え1
いろいろ調べた結果、この問題の解決策を見つけました。問題を解決する方法はわかっていますが、なぜ問題が発生するのかはまだわかりません。
この問題は、IIS 7 で使用できる「フレンドリ URL」メカニズムに関連しています。次App_Start\RouteConfig.cs
のコードを変更して、これを無効にしました。
var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Permanent;
routes.EnableFriendlyUrls(settings);
に:
var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Off;
routes.EnableFriendlyUrls(settings);
これで問題は解決しました。私の理解では、フレンドリー URL はファイル拡張子を削除するものであり、ページをリクエストするたびに 301 エラーが発生し、その後拡張子のないファイルが試行されるのはそのためだと思います。ただし、IIS がファイルを配信できない理由はわかりません。
とにかく、問題は解決しました。問題の診断に協力してくれた皆さんに感謝します。