0

我有产品的详细信息页面。该产品是通过查询字符串中的 id 获取的,如果在数据库中找到具有该 id 的产品,我们将显示详细信息,否则我们将显示“无法找到该项目”消息。很标准的东西。我想做的是在详细信息页面上显示“找不到此项目”消息,但发送 404 响应。这样 Google 将取消对已删除项目的索引。

所以我有这样的东西(简化):

<asp:Panel ID="pnlDetails" runat="server" Visible="false">
    item details go here
</asp:Panel>

<asp:Panel ID="pnlError" runat="server" Visible="false">
    <p>The specified  item could not be found.</p>
</asp:Panel>

And in the code behind:

if(itemFound)
{
   showDetails();
}
else
{
   showError();
}

private void showDetails()
{
   pnlDetails.Visible = true; 
   //fill in details
}

private void showError()
{
    //set response
    Response.StatusCode = 404;
    pnlError.Visible = true;
}

现在发生的事情是我看到了错误面板,但我仍然收到 200 响应。谁能告诉我我做错了什么?任何建议将不胜感激,非常感谢!

编辑:我在Page_Load事件处理程序中调用这些方法。

4

3 回答 3

2

我明白了......因为你的代码不会抛出 404,你实际上也想要它,所以谷歌会自然地清理你的死链接......试试这个:stackoverflow.throwing404errorsForMissingParameters

此外,这很有帮助(接近底部)forums.asp.net/throwing404InHTTPResponse。例如 HttpContext.Current.Respone.StatusCode = 404;

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.StatusCode = 404; 
    Response.End(); 
}
于 2012-09-25T14:02:26.963 回答
1

谷歌说..

如果您网站的过期页面出现在搜索结果中,请确保页面在标题中返回 404(未找到)或 410(已消失)状态。

这是源
所以你可以做什么..

  1. 如果找不到该项目 - 重定向到您的自定义 404 页面。
  2. 在 404 页面的 Page_Load 事件中添加这个..

    Response.StatusCode = 404;

但只要这样做,它就会返回 HTTP 302 重定向代码,然后返回 HTTP 200 - ok 代码。因此该页面不会从 Google 的索引中删除。
3. 打开 Global.asax 文件(如果不存在,添加它)。添加以下代码来处理 404(找不到页面)错误

     protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    if (ex is HttpException)
    {
        if (((HttpException)(ex)).GetHttpCode() == 404)
            Server.Transfer("~/404.aspx");
    }
    Server.Transfer("~/AnyOtherError.aspx");
}

但是,在这种情况下,请确保您在 web.config 中没有针对 404 的 customErrors 配置。希望对您有所帮助。

于 2012-09-25T12:53:14.833 回答
1

在方法中设置状态码Render,所以它可能看起来像这样:

protected override void Render(HtmlTextWriter writer) 
{ 
    base.Render(writer); 
    Response.StatusCode = 404; 
    pnlError.Visible = true;
} 
于 2012-09-25T12:55:33.143 回答