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

本文关键字:然后 重定向 标头 Gone 发送 | 更新日期: 2023-09-27 18:26:54

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

除了谷歌索引一个文件然后我们删除该文件时,效果很好。因此,我正在考虑在Response.Status中添加一个410 Gone,然后重定向到我们的error.aspx页面。

Firebug告诉我,当文件被删除时,它会在文档页面上得到一个"302Found"状态代码。我要410。

重定向代码为:

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

有人能告诉我我做错了什么吗?

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

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

不过,我认为您不应该重定向到错误页面,因为错误消息不是一个单独的资源,应该有自己的URL。如果客户端请求一个文件,而该文件已不存在,则发送一个410 gone状态,并将错误消息作为响应主体——这样,错误消息就会从不存在的文件本身的URL返回。搜索引擎将看到状态代码并了解文件已不存在,浏览器将向用户显示响应正文,以便用户读取错误消息。

如果您查看410 Gone的规范,它指出"没有已知的转发地址",因此重定向似乎无效。如果你想让人类用户看到一些东西,你可以在响应上返回与error.aspx相同的主体。

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

410的响应主要是为了协助web的任务通过通知接收方资源故意不可用,并且服务器所有者希望到该资源的远程链接将被删除。这样的事件对于有限的时间,促销服务和属于不再在服务器站点工作的个人。事实并非如此需要将所有永久不可用的资源标记为"消失",或将标记保留任意长度的时间--这取决于服务器所有者的自由裁量权。

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

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

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

这就是我必须执行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.
        }
    }

我一直在解决类似的问题。如果带有资源的页面从网络上删除,我想告诉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...

这在没有重定向的情况下为用户提供了对谷歌机器人和搜索备选方案的响应410。