C# 发送410 Gone标头,然后重定向
我有一个页面,检查用户是否登录或文件是否公开,然后通过Response.WriteFile将PDF推送到浏览器 除非Google为文件编制索引,然后我们删除该文件,否则效果很好。因此,我正在考虑在Response.Status中添加410,然后重定向到error.aspx页面 Firebug告诉我,当文件被删除时,它会在文档页面上获得一个“302已找到”状态代码。我在等410 重定向代码为:C# 发送410 Gone标头,然后重定向,c#,asp.net,http-headers,http-status-code-410,C#,Asp.net,Http Headers,Http Status Code 410,我有一个页面,检查用户是否登录或文件是否公开,然后通过Response.WriteFile将PDF推送到浏览器 除非Google为文件编制索引,然后我们删除该文件,否则效果很好。因此,我正在考虑在Response.Status中添加410,然后重定向到error.aspx页面 Firebug告诉我,当文件被删除时,它会在文档页面上获得一个“302已找到”状态代码。我在等410 重定向代码为: Response.Status = "410 Gone"; Response.AddHeader("Lo
Response.Status = "410 Gone";
Response.AddHeader("Location", Request.Url.ToString());
Response.Redirect("error.aspx");
有人能告诉我我做错了什么吗?这就是我如何做出永久性回应的方式。应该是类似的
//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.
}
}
重定向是通过发送一个状态来完成的,该状态指示资源在其他地方可用,例如301永久移动或302找到。不能在同一响应中发送两个状态代码。请求的资源不存在(因此您发送410),或者它确实存在于某个其他位置(因此您发送301或302或其他任何内容)
不过,我认为您不应该重定向到错误页面,因为错误消息不是应该有自己URL的单独资源。如果客户机请求一个文件,而该文件已消失,则发送410 gone状态,并将错误消息作为响应正文-这样,错误消息将从不存在的文件本身的URL返回。搜索引擎将看到状态代码并了解文件已丢失,浏览器将向用户显示响应正文,以便用户可以读取错误消息。如果查看规范,它会声明“没有已知的转发地址”,因此重定向似乎无效。如果希望人类用户看到某些内容,您可以在响应中返回与
error.aspx
相同的主体
请求的资源在服务器上不再可用,并且
转发地址是已知的。这种情况预计会发生
被认为是永久的。具有链接编辑功能的客户端应该
在用户批准后删除对请求URI的引用。如果
服务器不知道或没有工具来确定
该情况是永久性的,状态代码404(未找到)应为
用它来代替。除非另有说明,否则此响应是可缓存的
410响应主要是为了协助web应用程序的任务
通过通知收件人资源已被删除来进行维护
故意不可用,并且服务器所有者希望
无法删除指向该资源的远程链接。这样的事件对我们来说很常见
有限的时间、促销服务和资源属于
不再在服务器站点上工作的个人。事实并非如此
必须将所有永久不可用的资源标记为“消失”或
将标记保留任意长度的时间,这由
服务器所有者的自由裁量权
我一直在解决类似的问题。如果带有资源的页面从web上删除,我想告诉GoogleBot410离开了,从缓存中删除,但我想为访问者提供一个类似的替代页面 我是这样解决的:
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);
}
@model Bla.ModelGone410
@{
Layout = null;
Html.RenderAction("Index", "Search",
new
{
type = Model.type,
Category = Model.Category,
city_id = Model.city_id,
...
});
}
Gone410.cshtml看起来像这样:
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);
}
@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响应,并在不重定向的情况下为用户搜索备选方案。您也可以使用这种方式,首先更改您的愿望状态
Response.Status = "410 Gone";
Response.AddHeader("Location", Request.Url.ToString());
ScriptManager.RegisterStartupScript(this, this.GetType(), "redirectScript", "window.location.href=error.aspx", true);`
因此,您可以获得所需的页面和状态。CompleteRequest()不是有效的方法:)感谢您的输入:)@jet它是
HttpApplication.CompleteRequest
。它结束HTTP请求。我不知道你也在尝试重定向,这是错误的。你选择的答案是正确的