Отправка заголовка 410 Gone, затем перенаправление - PullRequest
2 голосов
/ 07 марта 2012

У меня есть страница, которая проверяет, вошел ли пользователь в систему или является ли файл общедоступным, а затем отправляет PDF-файл в браузер через Response.WriteFile.

Отлично работает, за исключением случаев, когда Google индексирует файл, а затеммы удаляем файл.Поэтому я смотрю, как добавить 410 Gone в Response.Status, а затем перенаправить на нашу страницу error.aspx.

Firebug сообщает, что при удалении файла он получает код состояния «302 найдено» на странице документа.Я ожидаю 410.

Код перенаправления:

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

Может кто-нибудь, пожалуйста, скажите мне, что я ошибаюсь, пожалуйста?

Ответы [ 5 ]

5 голосов
/ 07 марта 2012

Перенаправление выполняется путем отправки статуса, который указывает, что ресурс доступен где-то еще, например, 301 Перемещено навсегда или 302 найдено. Вы не можете отправить два кода состояния в одном ответе. Либо запрашиваемый ресурс не существует (таким образом, вы отправляете 410), либо он существует в каком-то другом месте (таким образом, вы отправляете 301 или 302 или что-то еще).

Я не думаю, что вы должны перенаправлять на страницу с ошибкой, потому что сообщение об ошибке не является отдельным ресурсом, который должен иметь свой собственный URL. Если клиент запрашивает файл и файл исчезает, отправьте состояние 410 Gone с сообщением об ошибке в качестве тела ответа - таким образом, сообщение об ошибке возвращается с URL самого несуществующего файла. Поисковая система увидит код состояния и поймет, что файл исчез, а браузер покажет пользователю тело ответа, чтобы он мог прочитать сообщение об ошибке.

1 голос
/ 12 января 2018

Вы также можете использовать этот способ, сначала измените свой статус желания.

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

Итак, вы получаете страницу желаний и статус.

1 голос
/ 07 марта 2012

Если вы посмотрите на спецификацию для 410 Gone , то там будет указано, что «адрес пересылки не известен», поэтому перенаправление кажется недействительным.В этом ответе вы можете вернуть то же тело, что и из error.aspx, если хотите, чтобы пользователи-люди что-то видели.

Запрошенный ресурс больше не доступен на сервере, а адрес пересылки неизвестен,Ожидается, что это условие будет считаться постоянным.Клиенты с возможностями редактирования ссылок ДОЛЖНЫ удалять ссылки на Request-URI после одобрения пользователя.Если сервер не знает или не имеет возможности определить, является ли условие постоянным, СЛЕДУЕТ использовать код состояния 404 (не найден).Этот ответ может быть кэширован, если не указано иное.

Ответ 410 в первую очередь предназначен для оказания помощи задаче веб-обслуживания путем уведомления получателя о том, что ресурс преднамеренно недоступен и что владельцы серверов желают, чтобы удаленные ссылки на этот ресурс былиудален.Такое мероприятие характерно для ограниченных по времени рекламных услуг и для ресурсов, принадлежащих лицам, которые больше не работают на сайте сервера.Нет необходимости отмечать все постоянно недоступные ресурсы как «пропавшие» или сохранять отметку в течение любого промежутка времени - это оставлено на усмотрение владельца сервера.

0 голосов
/ 25 мая 2013

Я решаю подобную проблему.Если страница с ресурсом будет удалена из Интернета, я хотел бы сказать, что 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 для бота Google ипоиск альтернативы для пользователя без перенаправления.

0 голосов
/ 07 марта 2012

Вот как я должен был сделать 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.
        }

    }
...