URL 结尾的点会导致 IIS 上出现空白的 404 页面

URL 结尾的点会导致 IIS 上出现空白的 404 页面

我在 IIS8 上有一个 ASP.NET 站点,但 IIS7.5 的行为完全相同。当我输入如下 URL 时:

mysite.com/foo/bar..

我收到以下错误,状态代码为“500 内部服务器错误”:

在此处输入图片描述

尽管我为 500 和 404 设置了自定义错误页面,但我没有发现我的自定义错误页面有任何问题。

在我的 web.config system.web 节点中我有以下内容:

<customErrors mode="On">
  <error statusCode="404" redirect="/404.aspx" />
</customErrors>

如果我删除该部分,我会收到 404.0 响应,但页面本身是空白的。

在 web.config system.webServer 中我有:

<httpErrors errorMode="DetailedLocalOnly">
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" prefixLanguageFilePath="" path="404.html" responseMode="File" />
</httpErrors>

但无论是否存在,我都会得到相同的空白 404.0 页面,而不是我预期的自定义错误页面,或者至少是内部 IIS 消息。

那么首先为什么 asp.net 处理程序会拾取“..”的请求(也适用于一个或多个尾随点)

如果我从 applicationHost.config 中删除以下处理程序:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />

我得到了预期的自定义 404 页面,但当然删除该处理程序会中断 asp.net 中的路由等。

查看故障轨迹,我发现:

在此处输入图片描述

该站点已禁用 Windows 身份验证,那么为什么该模块甚至在请求管道中?

现在我的解决方法是使用 URL Rewrite 模块和以下规则:

<rewrite>
    <rules>
        <rule name="Trailing Dots" stopProcessing="true">
            <match url="\.+$" />
            <action type="Rewrite" url="/404.html" appendQueryString="false" />
        </rule>
    </rules>
</rewrite> 

这没问题,但是我想知道为什么 IIS/ASP.NET 会这样做?

答案1

在该部分中添加此属性httpRuntime可能会帮助您:

<configuration>
  <system.web>
    <httpRuntime ... relaxedUrlToFileSystemMapping="true" .../>
  </system.web>
</configuration>

获取或设置一个值,该值指示 HTTP 请求中的 URL 是否必须是有效的 Windows 文件路径。

有关更多信息宽松的UrlToFileSystemMapping

答案2

有一个关于此内容的知识库:http://support.microsoft.com/kb/2520479

其结果是存在操作顺序问题,其中各种函数的 .NET 处理程序会混淆并误导事物。一些 .NET 处理程序将 URL 重写为无扩展名的形式,它们可能会使其他事情变得混乱。

简单的解决方法是将所有“ExtensionlessUrlHandler”处理程序移至列表的最末尾,位于您添加的任何可能接触 PathInfo 数据的自定义处理程序之后。

这可能不是您的确切错误,但值得一试。值得记住的是,处理程序顺序是由 ApplicationHost.Config 和相关配置文件中的 ADD 顺序配置的!

答案3

我无法回答为什么 dotnet 框架会出现这种令人讨厌的行为。它几乎就像将 404 视为已处理的 404 并跳过默认的 IIS 404 页面。也许它设置了:

Response.IisTrySkipIisCustomErrors

Microsoft 文档

无论如何,当我实施你的规则时,我调整了你的正则表达式以支持尾随 .的可选/

例如

https://localhost/investing./

我已对其进行更新以支持可选斜线。

<rule name="Trailing Dots" stopProcessing="true">
    <match url="\.+/?$" />
    <action type="Rewrite" url="/404.html" appendQueryString="false" />
  </rule>

我本来想将其添加为评论,但没有级别来执行此操作。

相关内容