IIS 7未提供默认文档

20
我们在一些开发者工作站上遇到了一个问题:当访问一个没有文件名的URL(例如http://localhost/)时,IIS 7会返回404错误。所有人都在运行Windows 7/IIS 7.5和ASP.NET 4.0。应用程序池配置为使用Classic管道模式。
默认文档已启用,并且default.aspx在默认文档列表中。
我启用了故障请求跟踪,并在日志中看到了这个:
OldHandlerName="", NewHandlerName="ExtensionlessUrl-ISAPI-4.0_64bit", 
  NewHandlerModules="IsapiModule", 
  NewHandlerScriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll", NewHandlerType=""

稍后,我发现这个IsapiModule正在拒绝请求:
ModuleName="IsapiModule", Notification="EXECUTE_REQUEST_HANDLER", HttpStatus="404",
  HttpReason="Not Found", HttpSubStatus="0", 
  ErrorCode="The operation completed successfully. (0x0)", ConfigExceptionInfo="" 

看起来IIS认为ExtensionlessUrl-ISAPI-4.0-64bit应该处理请求。 当我查看该模块的配置时,它显示应该匹配路径*.,所以我不明白为什么它没有匹配任何路径。
谷歌搜索IIS.net论坛上的此帖子(2005年)。 不幸的是,没有提供解决方案,只是确认了问题。
当我将我的应用程序池更新为使用集成模式时,问题消失了。 不幸的是,它必须在经典模式下运行。
我该怎么做才能使IIS再次提供我们的默认文档?

1
查找您是否已安装Windows7 SP1或热修复程序KB KB980368。我曾经遇到过一些与此热修复程序有关的问题(该热修复程序已包含在SP1中):https://dev59.com/nFTTa4cB1Zd3GeqPtpES - Kev
@Kev 谢谢。你提供的知识库文章似乎解释了我遇到的问题。 - Aaron Jensen
奇怪,我也遇到了同样的问题,但我的在经典模式下可以工作,但在集成模式下不行(我必须使用集成模式)。 - Derek Greer
我刚刚通过将应用程序池切换到集成模式来解决了这个问题。 - Michael12345
6个回答

23

看起来微软发布了一项更新,使得ExtensionlessURL HTTP处理程序可以处理没有扩展名的URL。不幸的是,这会破坏其他一些处理程序。在我的情况下,是在经典应用程序池下的DefaultDocument处理程序。解决方案是在我们应用程序的web.config中删除ExtensionlessURL处理程序:

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrl-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrl-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrl-Integrated-4.0" />
  </handlers>
</system.webServer>

1
这解决了我的同样的问题,即我的index.php没有被调用。我为运行PHP的嵌套应用程序配置了一个经典模式的应用程序池。 - John B
4
注意,对于我来说这并没有起作用 - 它需要是 "ExtensionlessUrlHandler-Integrated-4.0"。 - Dylan Nicholson
这解决了我遇到的问题。感谢您发布这篇文章,否则我可能永远不会偶然发现它。Dylan在字符串不是完全精确方面是正确的,但处理程序干扰IIS默认文档设置的事实是一个关键发现。 - Jim

15

我通过将"StaticFile"处理程序放在"ExtensionlessUrlHandler-*"之前的HandlerMapping中解决了这个问题。


这对我也起作用了。我正在运行一个混合网站,旧的迁移asp.net 2站点与MVC5并存,在升级到MVC5后,我的默认文档(奇怪的是它不是静态页面,我的默认页面是Default.aspx,并带有大量代码),并将StaticFile移到Extensslessurlhandler-ISAPI-4.0_32bit和其他2个extensionlessUrlhander之上,解决了问题。哎呀!谢谢你!请注意,它会完全搞乱您的Web配置,因为手动“移动”处理程序会将所有在web.config中列出的处理程序都移动。 - snowcode
这对我也起作用了,当被接受的答案没有时。在我的情况下,我有一个index.html文件,我希望它成为主页,但我需要无扩展名处理程序来保持我的Web API设置不会出错。 - Aaron Averett

1
我在 web.config 的 URL 重定向中使用以下规则作为解决此问题的解决方法:
 <system.webServer>
    <rewrite>
      <rules>
        <rule name="Default document rewrite" stopProcessing="true">
          <match url="^(.+/)?$" />
          <action type="Redirect" url="https://{HTTP_HOST}/default.aspx" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

1
我注意到从应用程序池中移除托管的.NET框架(4.0)也能解决我的问题!在我们的IIS环境中根本不使用.NET!

0
将DefaultDocument组件添加到IIS中的添加/删除Windows功能中,然后插入我的默认脚本名称(index.php),这对我很有效。

0

更改StaticFile的顺序有助于解决问题,当在IIS中设置网站应用程序的默认文档时,根网站还有另一个默认文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接