我在 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 文件路径。
答案2
有一个关于此内容的知识库:http://support.microsoft.com/kb/2520479
其结果是存在操作顺序问题,其中各种函数的 .NET 处理程序会混淆并误导事物。一些 .NET 处理程序将 URL 重写为无扩展名的形式,它们可能会使其他事情变得混乱。
简单的解决方法是将所有“ExtensionlessUrlHandler”处理程序移至列表的最末尾,位于您添加的任何可能接触 PathInfo 数据的自定义处理程序之后。
这可能不是您的确切错误,但值得一试。值得记住的是,处理程序顺序是由 ApplicationHost.Config 和相关配置文件中的 ADD 顺序配置的!
答案3
我无法回答为什么 dotnet 框架会出现这种令人讨厌的行为。它几乎就像将 404 视为已处理的 404 并跳过默认的 IIS 404 页面。也许它设置了:
Response.IisTrySkipIisCustomErrors
无论如何,当我实施你的规则时,我调整了你的正则表达式以支持尾随 .
的可选/
。
例如
https://localhost/investing./
我已对其进行更新以支持可选斜线。
<rule name="Trailing Dots" stopProcessing="true">
<match url="\.+/?$" />
<action type="Rewrite" url="/404.html" appendQueryString="false" />
</rule>
我本来想将其添加为评论,但没有级别来执行此操作。