ASP.NET自定义404

ASP.NET自定义404,asp.net,http-status-code-404,seo,Asp.net,Http Status Code 404,Seo,我有一个数据库驱动的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.asp

我有一个数据库驱动的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页面本身,并有效地影响我现有的所有页面?我的意思是:

I 404 main.aspx?page=不存在的标题,但是我的404会使用任何查询字符串(包括有效字符串)影响main.aspx,例如main.aspx?page=存在的标题

该网站在IIS6/Win 2003上运行

谢谢你的帮助


约翰

为什么不建立搜索引擎友好的URL呢?这很容易。下面是另一个用于在web表单中使用路由的方法

因为你们有一个数据驱动的网站,我还建议你们每天更新一个有效的URL,并提交给搜索引擎

就自定义错误而言,may be web server(IIS6)正在覆盖以显示其自己的自定义错误页-检查IIS端的自定义错误消息管理

编辑
当前您看到的是空白404页面,因为您没有发送任何错误页面内容(您的代码设置状态代码,然后结束响应)。当然,您可以使用IIS端设置来设置自定义错误页面,但如果您想显示aspx页面,我建议您执行
Server.Transfer
到错误页面(404.aspx)。在404.aspx中,您必须将状态代码设置为404,但不要执行
Response.End
,否则将无法提供错误页面内容。

最后请记住,浏览器在错误页面中有一个最小内容大小的阈值,如果内容大小小于此值,则它将显示自己的错误页面。对于IE,404错误的大小为521字节。请参阅此博文:

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

最好的方法是创建一个HTTPModule并在那里进行检查

例如来自

但是,我确实同意VinayC关于友好web URL的100%。您可以设置路由,使其转到当前的main.aspx?page=blah+blah2-或者,您可以使用HTTPModule(在链中足够早以实现效果)重写路径

有了你现有的链接,我会发布一个301 perm重定向到新的url,这样谷歌就能很好地得到更新


另一个选择是使用不同的分隔符,因为obv google不喜欢+。我将使用下划线页面_Title _One

我不想更改我的URL结构,我想改为强制404错误。@JohnCollins,您的旧URL结构仍将受到支持。然而,向前看,您可以有友好的URL。不管URL结构如何,提交站点地图总是一个好主意。最后,请参阅我的404错误编辑。我不想更改我的URL结构。你重定向到404页面的回答对我不起作用,因为我想强制执行一个真正的404错误。如果我重定向状态码,搜索引擎看到的不会是404。
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(){

    }
}