2

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

效果很好,除非 Google 索引文件然后我们删除该文件。所以我正在考虑将 410 Gone 添加到 Response.Status,然后重定向到我们的 error.aspx 页面。

Firebug 告诉我,当文件被删除时,它会在文档页面上获得“302 Found”状态代码。我期待410。

重定向代码为:

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

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

4

5 回答 5

5

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

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

于 2012-03-07T01:09:34.807 回答
1

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

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

410 响应的主要目的是通过通知接收者该资源故意不可用并且服务器所有者希望删除到该资源的远程链接来协助 Web 维护任务。这种事件对于限时促销服务和属于不再在服务器站点工作的个人的资源很常见。没有必要将所有永久不可用的资源标记为“已消失”或将标记保留任何时间 - 这由服务器所有者自行决定。

于 2012-03-07T03:33:15.087 回答
1

你也可以用这种方式,先改变你的欲望状态。

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

因此,您也可以获得所需的页面和状态。

于 2018-01-12T06:46:55.807 回答
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.
        }

    }
于 2012-03-07T00:58:15.547 回答
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,并为没有重定向的用户搜索替代方案。

于 2013-05-25T15:01:35.683 回答