2011-03-05 40 views
0

我正在IIS 7上运行一个Sitefinity CMS网站。当我试图返回404状态时,我看到了一些奇怪的结果。IIS 7错误代码

如果我去像一个网址:

www.mysitefinitywebsite.com/test.co.uk(我意识到这是一个无效的地址,但有人进入它进入CMS)

由于上面没有一个ASPX页面,我相信IIS处理错误,用下面的代码:

<httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/404.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 

在地址栏中的URL保持不变,显示我的自定义404页(/404.aspx)页面,然而,返回http状态码200。

然而,如果下面的网址是键入:

www.mysitefinitywebsite.com/test.aspx - 的ASPX错误处理程序踢在以下配置:

<customErrors mode="On" > 
    <error redirect="~/Sitefinity/nopermissions.aspx" statusCode="403" /> 
    <error redirect="~/404.aspx" statusCode="404" /> 
</customErrors> 

同样,我的自定义404显示页面,但是URL地址栏更改为:

www.mysitefinitywebsite.com/404.aspx?aspxerrorpath=/test.aspx

而且奇怪的是,如果我检查Firebug,则返回302代码为text.aspx,然后为/404.aspx?aspxerrorpath=/test.aspx返回200的状态。

我不完全理解这里发生了什么,它似乎是IIS没有响应与状态代码 - 是由设计?似乎完全疯了!

如果是通过设计,大概解决它的唯一方法是以编程方式返回正确的响应代码?

在此先感谢 higgsy

回答

0

当您使用<httpErrors>元素,并使用executeUrl,你是动态内容服务。如果该内容没有明确返回状态代码(asp.net,asp等页面),则需要将existingResponse属性设置为auto/replace/passthrough,只要您认为合适。

这里的意图是网络服务器可以有一个通用的错误,你可能想要返回一个不同的或扩展的错误代码给你的客户端。这对于那些您可能希望404包含/返回更多关于什么未找到的信息等的API更有意义。

查看httpdError对于existingResponse标记的IIS.NET文档

http://www.iis.net/ConfigReference/system.webServer/httpErrors


对于ASP.NET,302重定向错误是默认的行为,这是你所看到的。 B/C页面返回404,您正在重定向到以编程方式设置响应的状态代码。

不同之处仅仅在于处理。首先,您允许IIS在执行ASP.NET管道之前处理错误。第二,IIS传递给ASP.NET管道。他们是两种不同的技术,因此是两种不同的行为。放心一点研究,你可以让他们都做同样的事情。