我有一个ASP.NET应用程序,如果找不到请求的内容,它有时会重定向到404页面。这是这样做的:
var data = MyDatabase.RetrieveData(dataID);
if (data == null)
Response.Redirect("~/My404Page.aspx");
这对用户来说非常有用。但这会导致302 Found
(重定向),而不是404 Not Found
,这对于搜索爬虫来说并不理想。我希望返回一个404状态代码,并且仍然向用户显示有用的内容。
著名的internet's most awkard 404 page可以做到这一点;如果您在该域中输入了一个错误的URL,并使用诸如Fiddler之类的命令查看结果,那么您实际上会得到一个404代码。
我试过了:
Response.StatusCode = 404;
这将正确设置404代码,但会继续呈现页面。我也尝试过这个:
throw new HttpException(404, "Not Found");
但这与处理任何其他未捕获的异常(通过302
重定向到服务器错误页面)做的事情是一样的。
我已经想出了一种在我的应用程序中通过一些自定义逻辑来解决这个问题的方法,包括自己设置状态代码和编写一个javascript重定向到响应。但是我想要的是一种用代码隐藏的方式来表达这个请求应该停止处理并重定向到404错误页面(我相信它可以在IIS或web.config中指定)。这个是可能的吗?
发布于 2012-07-19 21:16:13
如果你不想要302重定向,你需要做Server.Transfer而不是Repsonse.Redirect。Response.Redirect()向浏览器返回一个响应,告诉它加载~/My404Page.aspx。Server.Transfer()将控制权转移到~/My404Page.aspx而不返回浏览器,这意味着您的浏览器不会收到302重定向消息。
您还需要确保将404页面上的Response.StatusCode属性设置为404。
或者,如果抛出HttpException,您可以通过设置redirectMode property to ResponseRewrite重定向到自定义的404页面,而无需在服务器中执行302。这仅适用于较新版本的ASP.NET。
发布于 2012-07-19 21:15:30
在web应用程序的web.config
中使用CustomErrors
属性
<configuration>
<system.web>
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly">
<error statusCode="404"
redirect="My404Page.aspx"/>
</customErrors>
</system.web>
</configuration>
https://stackoverflow.com/questions/11569355
复制相似问题