0

我在 IIS 7 上运行 Sitefinity CMS 网站。当我尝试返回 404 状态时,我看到了一些奇怪的结果。

如果我访问如下 URL:

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,text.aspx 会返回 302 代码,然后 /404.aspx?aspxerrorpath=/test.aspx 会返回 200 状态。

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

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

在此先感谢希格斯

4

1 回答 1

0

当您使用<httpErrors>元素和 usingexecuteUrl时,您正在提供动态内容。如果该内容没有明确返回状态代码(asp.net、asp 等页面),您需要根据需要将该 existingResponse属性设置为 auto/replace/passthrough。

这里的意图是 Web 服务器可能会出现一般错误,您可能希望向客户端返回不同的或扩展的错误代码。这对于您可能希望 404 包含/返回有关未找到内容等的更多信息的 API 更有意义。

查看有关现有响应标志的 httpErrors 的 IIS.NET 文档

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


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

差异只是由处理引起的。首先,您允许 IIS 在执行 ASP.NET 管道之前处理错误。第二,IIS 传递给 ASP.NET 管道。他们是两种不同的技术,因此有两种不同的行为。请放心,只需进行一些研究,您就可以让它们都做同样的事情。

于 2011-03-05T18:51:56.757 回答