2

如果找不到请求的内容,我有一个 ASP.NET 应用程序有时会重定向到 404 页面。这是这样做的:

var data = MyDatabase.RetrieveData(dataID);
if (data == null)
   Response.Redirect("~/My404Page.aspx");

这对用户非常有用。但这会导致302 Found(重定向),而不是404 Not Found,这对于搜索爬虫来说并不理想。我想返回一个 404 状态代码并仍然向用户显示有用的内容。

著名的互联网上最尴尬的 404 页面就是这样做的;如果您在该域中输入错误的 URL 并使用 Fiddler 之类的内容查看结果,您实际上会得到一个 404 代码。

我试过这个:

Response.StatusCode = 404;

这会正确设置 404 代码,但会继续呈现页面。我也试过这个:

throw new HttpException(404, "Not Found");

但这与任何其他未捕获的异常(通过重定向302到服务器错误页面)的作用相同。

我已经找到了一种通过一些自定义逻辑在我的应用程序中解决此问题的方法,这些逻辑涉及自己设置状态代码并编写 JavaScript 重定向到响应。但我想要的是一种在代码隐藏中表达该请求应该停止处理并重定向到 404 错误页面(我相信可以在 IIS 或 web.config 中指定)的方法。这可能吗?

4

2 回答 2

2

如果您不希望 302 重定向,则需要执行 Server.Transfer 而不是 Repsonse.Redirect。Response.Redirect() 将响应发送回浏览器,告诉它加载您的 ~/My404Page.aspx。Server.Transfer() 将控制权转移到您的 ~/My404Page.aspx 而无需返回浏览器,这意味着您的浏览器不会收到 302 重定向消息。

您还需要确保在 404 页面上将 Response.StatusCode 属性设置为 404。

或者,如果您抛出 HttpException,您可以通过将redirectMode 属性设置为 ResponseRewrite来重定向到您的自定义 404 页面,而无需在服务器中执行 302 。这仅适用于较新版本的 ASP.NET。

于 2012-07-19T21:16:12.963 回答
1

在您的 Web 应用程序中使用该CustomErrors属性web.config

<configuration>
  <system.web>
    <customErrors defaultRedirect="GenericError.htm"
                  mode="RemoteOnly">
      <error statusCode="404"
             redirect="My404Page.aspx"/>
    </customErrors>
  </system.web>
</configuration>
于 2012-07-19T21:15:29.657 回答