我有一个页面可以检查用户是否已登录或文件是否公开,然后通过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");
有人可以告诉我我的错误吗?
答案 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.