301 редирект asp.net 4.0


Я пытаюсь реализовать перенаправление URL для веб-сайта, а не делать это страница за страницей. Я хочу сделать это в глобальном масштабе.файл asax. Ниже приведен код, который я определил.

Я хочу иметь http://website.net как мой основной url-адрес и хочу иметь постоянный URL-адрес перенаправления, если кто-то вводит в http://www.website.net .

К сожалению, он не работает для веб-сайта live. Может ли кто-нибудь указать на проблему в коде. Код не создает никаких ошибок.

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("http://website.net"))
    {
        HttpContext.Current.Response.Status = "301 Moved Permanently";
        HttpContext.Current.Response.AddHeader("Location", Request.Url.ToString().ToLower().Replace("http://website.net", "http://www.website.net"));
    }

}
5 9

5 ответов:

Главная проблема: Вы делаете все это в Application_Start, что выполняется только один раз. Вы должны подключаться к каждому запросу. Попробуйте это:

void Application_BeginRequest(object sender, EventArgs e) 
{
    // Code that runs on every request

    if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("http://website.net"))
    {
        HttpContext.Current.Response.Status = "301 Moved Permanently";
        HttpContext.Current.Response.AddHeader("Location", Request.Url.ToString().ToLower().Replace("http://website.net", "http://www.website.net"));
    }

}

Еще лучше было бы использовать перезапись URL, которая может быть настроена изнутри Web.Config:

Microsoft rewriting module-Force www on url или remove www from url

При использовании IIS 7 или более поздней версии самым простым решением является использование элемента httpRedirect в вашем вебе.конфиг.

<httpRedirect enabled="true" exactDestination="true" httpResponseStatus="Permanent">
     <add wildcard="/MyOldAspFile.aspx" destination="/MyNewFile.aspx" />
     <add wildcard="/MyOldHtmlFile.html" destination="/MyNewFile.aspx" />
</httpRedirect>

Этот метод очень мощный, например, если вы изменили домен, но страницы остались прежними, вам нужно просто добавить:

<system.webServer> 
    <httpRedirect enabled="true" childOnly="true" destination="http://www.mynewdomain.com/" /> 
</system.webServer>

Я написал здесь небольшую статью: ASP.NET 301 постоянные редиректы: лучшее решение

Версия 4 .NET фактически имеет улучшенную функцию для одностраничной реализации - redirectpermanent .

Response.RedirectPermanent(NEW_URL);

Основываясь на предыдущих правильных и полезных ответах, приведем несколько конкретных примеров. Предположим, вы хотите удалить старую страницу (как это сделал я), есть несколько вариантов.

Вариант 1: измените глобальный.asax

 void Application_BeginRequest(object sender, EventArgs e)
    {
        // Add permanent redirection for retired pages
        if (Request.Url.LocalPath.ToLower().StartsWith("/[OLD PAGE NAME]"))
        {
            Response.RedirectPermanent("/[NEW PAGE NAME]", false);
        }
    }

Вариант 2: Измените веб.config

<system.webServer>
    <httpRedirect enabled="true" httpResponseStatus="Permanent">
        <add wildcard="/[OLD PAGE NAME]" destination="/[NEW PAGE NAME]" />
    </httpRedirect>
</system.webServer>    

Если вы не знаете, что такое доменное имя приложения, используйте что-то вроде этого

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority).Contains("localhost"))return;
        var leftPartOfUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority).ToLower();
        if (leftPartOfUrl.StartsWith("http") && leftPartOfUrl.Split('.').Length == 1)
        {
            var fullUrl = HttpContext.Current.Request.Url.ToString();
            HttpContext.Current.Response.Status = "301 Moved Permanently";
            HttpContext.Current.Response.StatusCode = 301;
            HttpContext.Current.Response.AddHeader("Location", fullUrl.Insert(fullUrl.IndexOf("://", StringComparison.Ordinal) + 3, "www."));
            HttpContext.Current.Response.End();
        }
    }