发送410 Gone标头,然后重定向

时间:2012-03-07 00:46:55

标签: c# asp.net http-headers http-status-code-410

我有一个页面可以检查用户是否已登录或文件是否公开,然后通过Response.WriteFile将PDF推送到浏览器。

除非Google对文件编制索引然后删除该文件,否则效果很好。所以我正在为Response.Status添加一个410 Gone,然后重定向到我们的error.aspx页面。

Firebug告诉我,删除文件时,文档页面上会显示“302 Found”状态代码。我期待着410。

重定向代码为:

Response.Status = "410 Gone";
Response.AddHeader("Location", Request.Url.ToString());
Response.Redirect("error.aspx");

有人可以告诉我我的错误吗?

5 个答案:

答案 0 :(得分:5)

重定向是通过发送一个状态来完成的,该状态指示资源在其他地方可用,例如301 Moved Permanently或302 Found。您不能在同一响应中发送两个状态代码。请求的资源不存在(因此您发送410)或者它确实存在于某个其他位置(因此您发送301或302或其他任何内容)。

我认为您不应该重定向到错误页面,因为错误消息不是应该拥有自己的URL的单独资源。如果客户端请求文件并且文件已经消失,则发送410 Gone状态,并将错误消息作为响应正文 - 这样,错误消息将从不存在的文件本身的URL返回。搜索引擎将查看状态代码并了解文件已消失,浏览器将向用户显示响应正文,以便他可以阅读错误消息。

答案 1 :(得分:1)

如果您查看410 Gone的规范,它会声明“没有转发地址已知”,因此重定向似乎无效。如果您希望人类用户看到某些内容,您可以在error.aspx的响应中返回相同的正文。

  

请求的资源在服务器上不再可用,没有   转发地址是已知的。预计这种情况会发生   被视为永久性具有链接编辑功能的客户端应该   用户批准后删除对Request-URI的引用。如果   服务器不知道,或无法确定,无论是否   条件是永久的,状态代码404(未找到)应该是   用来代替。除非另有说明,否则此响应是可缓存的。

     

410响应主要用于协助网络任务   通过通知收件人资源是维护   故意不可用,服务器所有者希望如此   将删除该资源的远程链接。这样的事件很常见   限时,促销服务和属于的资源   个人不再在服务器的网站上工作。它不是   必须将所有永久不可用的资源标记为“已消失”或   保持标记任何时间长度 - 留给   服务器所有者的自由裁量权。

答案 2 :(得分:1)

您也可以使用这种方式,首先改变您的愿望状态。

Response.Status = "410 Gone"; Response.AddHeader("Location", Request.Url.ToString()); ScriptManager.RegisterStartupScript(this, this.GetType(), "redirectScript", "window.location.href=error.aspx", true);

所以,你也可以得到你想要的页面和状态。

答案 3 :(得分:0)

这就是我必须做的301移动永久响应。它应该是类似的

    //in Global.asax.cs
    protected virtual void Application_BeginRequest (Object sender, EventArgs e)
    {
        if(Request.Url.Host=="www.earlz.biz.tm" || Request.Url.Host=="earlz.biz.tm" || Request.Url.Host=="www.lastyearswishes.com"){
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location","http://lastyearswishes.com"+Request.Url.PathAndQuery);
            CompleteRequest(); //I believe this is the missing piece in your code.
        }

    }

答案 4 :(得分:0)

我一直在解决类似的问题。如果从网页上删除了包含资源的页面,我想告诉Google Bot 410 Gone,从缓存中删除,但我想向访问者提供另一个类似的页面。

我已经解决了这个问题:

public ActionResult RealEstate(int id, string title)
{
...prepare the model
if (realEstateModel.Result.OfferState == OfferState.Deleted)
{
    var alternativeSearchResult = PrepareAlternative(realEstateModel);
    return Gone410(alternativeSearchResult, context);                                        
}
else
   return View(realEstateModel);

}

Gone410.cshtml看起来像这样:

@model Bla.ModelGone410

@{
    Layout = null;

    Html.RenderAction("Index", "Search",
        new
        {
            type = Model.type,
            Category = Model.Category,
            city_id = Model.city_id,
            ...
        });
}

和RealEstate.cshtml:

@model Bla.realEstateModel

@{
    Layout = null;
}

This is realestate view...

这为没有重定向的用户提供了google bot和搜索替代方案的响应410.