在URL中拖尾点导致IIS上的空404页面

我在IIS8上有一个ASP.NET站点,但IIS7.5的行为完全相同。 当我input一个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> 

但是不pipe有没有,我得到相同的空白404.0页面,而不是我预期的自定义错误页面,或至less一个内部IIS消息。

所以首先,为什么asp.net处理程序会提取“..”的请求(也可以使用一个或多个尾随点)

如果我从applicacationHost.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身份validation已禁用该站点,那么为什么该模块甚至在请求pipe道?

现在我的修补程序是使用以下规则使用URL重写模块:

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

这工作正常,但我想知道为什么IIS / ASP.NET的行为呢?

有关于此的KB: http : //support.microsoft.com/kb/2520479

其结果是有一个操作顺序问题,其中各种function的.NET处理程序混淆和misdirect的东西。 某些.NET处理程序将url重写为扩展名forms,他们可能会吓坏其他东西。

短暂的解决方法是将所有“ExtensionlessUrlHandler”处理程序移动到列表的最后,在添加了可能会触及PathInfo数据的任何自定义的处理程序之后。

这可能不是你确切的错误,但它是值得尝试。 值得记住的是,处理程序的顺序是通过ApplicationHost.Config中的ADD命令和相关的configuration文件来configuration的!

httpRuntime部分中添加此属性可以帮助您:

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

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

有关relaxedUrlToFileSystemMapping的更多信息