ASP.NET自定义404错误页面

3

我是一个数据库驱动的ASP.NET网站,使用单个APSX页面来显示所有网站页面。因此,网站的所有URL都采用以下格式:

/main.aspx?page=Page+Title+One

/main.aspx?page=Another+Article+Title

不幸的是,谷歌索引了许多不存在的URL,大多数情况下是截取了查询字符串的一部分。例如:

/main.aspx?page=Page+Title or /main.aspx?page=Page

而不是正确的:

/main.aspx?page=Page+Title+One (this is indexed by Google as well of course).

我想要实现的是,如果查询字符串页面名称在我的数据库中没有匹配项,则在服务器端强制显示404错误,这样可以提供更好的用户体验并告诉Google这些页面不存在。
以下是我的代码,但它并不起作用。我的意思是它在IE 8中只显示一个空页面,在最新的Firefox中则会出现错误:
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.StatusCode = 404;
System.Web.HttpContext.Current.Response.Status = "404 Not Found";
System.Web.HttpContext.Current.Response.End();

我在日志中看到了正确的404代码,但是我没有被重定向到我在web.config文件中指定的错误页面:

<customErrors mode="On">
      <error statusCode="404" redirect="404.aspx"/>
</customErrors>

我做错了什么?

还有一件让我有些担心的事情是,如果我成功地强制在任何数据库中不存在匹配项的查询字符串条目上生成404错误,那么这不会有效地影响所有现有页面的main.aspx页面吗? 我的意思是:

我使main.aspx?page=Non-Existing-Title 产生404错误,然而我的404错误也会影响具有包括有效标题的任何查询字符串的main.aspx,例如main.aspx?page=Existing-Title。

该网站运行在IIS6/Win 2003上。

感谢您的帮助!

约翰

2个回答

2
为什么不建立搜索引擎友好的URL——使用ASP.NET routing非常容易。这里还有一个快速入门,介绍如何在Web表单中使用路由。
因为你的网站是数据驱动的,我建议你每天构建一个网站地图,包含有效的URL,并提交给搜索引擎。
至于自定义错误页面,可能是Web服务器(IIS6)覆盖了显示其自己的自定义错误页面,请查看此链接以管理IIS端的自定义错误消息。
编辑:
当前您看到空白的404页面,因为您没有发送任何错误页面内容(您的代码设置了状态代码然后结束响应)。您当然可以使用IIS侧的设置来拥有您的自定义错误页面,但如果您想显示您的aspx页面,则建议您将其转移到错误页面(404.aspx)Server.Transfer。在404.aspx中,您必须将状态代码设置为404,但不要执行Response.End,否则错误页面内容将无法提供。
最后,请记住浏览器对错误页面的最小内容大小有一个阈值,如果内容大小小于它,则会显示自己的错误页面。对于IE,404错误的大小为521字节。请参见此博客文章:http://perishablepress.com/press/2008/01/21/important-note-for-your-custom-error-pages/

我不想改变我的URL结构,而是想强制显示404错误。 - John Collins
@JohnCollins,您的旧URL结构仍将得到支持。但是,从现在开始,您可以使用友好的URL。无论URL结构如何,提交站点地图始终是一个好主意。最后,请查看我的编辑以获取404错误信息。 - VinayC

0

它不会使用自定义错误,因为那里有一个名为main.aspx的页面。

在我看来,最好的方法是创建一个HTTPModule并在其中进行检查。

例如,来自http://forums.asp.net/t/762031.aspx/1

public class ErrorModule : IHttpModule
{

    //Default implementation details left out…
    private void FakeA404(Object source, EventArgs e)
    {
        // do your URL checking here .. 
        HttpContext.Current.Response.StatusCode = 404;
    }

    public void Init(HttpApplication context)
    {
        context.AuthenticateRequest += new EventHandler(this.FakeA404);
    }

    public void Dispose(){

    }
}

然而,我完全同意VinayC关于友好的网页URL的观点。您可以设置路由,使其转到当前的main.aspx?page=blah+blah2页面-或者您可以使用HTTPModule(在链条中较早的位置)来重写路径。

对于您现有的链接,我建议发出301永久重定向到新URL,这样谷歌就能很好地更新了。

另一个选项是使用不同的分隔符,因为显然谷歌不喜欢“+”号。我会使用下划线Page_Title_One。


我不想改变我的 URL 结构。你提供的重定向到 404 页面的回答对我无效,因为我想强制发生真正的 404 错误。如果我重定向了状态码,则搜索引擎看到的将不会是 404。 - John Collins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接