Как 301 перенаправить в ASP.NET 4.0?

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

Я хочу иметь http://website.net в качестве основного URL-адреса и хочу иметь постоянную переадресацию URL-адресов, если кто-то набирает информацию на http://www.website.net.

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

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"));
    }

}

Ответ 1

Основная проблема: вы делаете вышеуказанный материал в 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 переписывающий модуль - Force www на url Или удалите www из url

Ответ 2

Если использовать IIS 7 или выше, самым простым решением является использование элемента httpRedirect в вашем web.config.

<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: лучшее решение

Ответ 3

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

Response.RedirectPermanent(NEW_URL);

Ответ 4

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

ВАРИАНТ 1: Измените Global.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: измените web.config

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

Ответ 5

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

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();
        }
    }