asp.net mvc: как перенаправить не www на www и наоборот - PullRequest
42 голосов
/ 07 июля 2010

Я бы хотел перенаправить весь трафик www на трафик не www

Я скопировал это в мой web.config

<system.webServer> / <rewrite> / <rules> 

<rule name="Remove WWW prefix" > 
<match url="(.*)" ignoreCase="true" /> 
<conditions> 
<add input="{HTTP_HOST}" pattern="^www\.domain\.com" /> 
</conditions> 
<action type="Redirect" url="http://domain.com/{R:1}" 
    redirectType="Permanent" /> 
</rule> 

за это сообщение

Как перенаправить URL-адреса "www" на URL-адреса без "www" или наоборот?

но я получил внутреннюю ошибку сервера 500.

Ответы [ 7 ]

75 голосов
/ 07 июля 2010

Вы могли бы рассмотреть другой подход:

protected void Application_BeginRequest (object sender, EventArgs e)
{
   if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
   {
      UriBuilder builder = new UriBuilder (Request.Url);
      builder.Host = "www." + Request.Url.Host;
      Response.Redirect (builder.ToString (), true);
   }
}

Тем не менее, будет выполнено перенаправление 302, поэтому рекомендуется небольшая настройка:

protected void Application_BeginRequest (object sender, EventArgs e)
{
   if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
   {
      UriBuilder builder = new UriBuilder (Request.Url);
      builder.Host = "www." + Request.Url.Host;
      Response.StatusCode = 301;
      Response.AddHeader ("Location", builder.ToString ());
      Response.End ();
   }
}

Этот вернет 301 Перемещение навсегда

12 голосов
/ 07 июля 2010

если вы скопировали его напрямую, значит, у вас неправильная разметка в вашем файле web.config

вам нужно

<system.webServer> 
    <rewrite>
      <rules>
        <rule name="Remove WWW prefix" > 
        <match url="(.*)" ignoreCase="true" /> 
        <conditions> 
        <add input="{HTTP_HOST}" pattern="^www\.domain\.com" /> 
        </conditions> 
        <action type="Redirect" url="http://domain.com/{R:1}" 
            redirectType="Permanent" /> 
        </rule> 
      </rules>
    </rewrite>
<system.webServer>

Строка с надписью

<system.webServer> / <rewrite> / <rules> 

заявляет, что вам нужно поместить конфигурацию в это место в вашем web.Config.
<system.webServer> - это одна из настроек config вашего файла web.Config.

EDIT:

Убедитесь, что сначала у вас установлен модуль перезаписи URL для IIS7

На странице выше говорится о перенаправлении HTTP на HTTPS, но концепция все еще применяется для WWW не WWW

Также, вот некоторая подробная информация о том, как все это объединяется.

8 голосов
/ 17 апреля 2012
    **For a www to a non www Thanks @developerart**

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
        {
            UriBuilder builder = new UriBuilder(Request.Url);
            builder.Host = Request.Url.Host.Replace("www.","");
            Response.StatusCode = 301;
            Response.AddHeader("Location", builder.ToString());
            Response.End();
        }
    }
5 голосов
/ 26 октября 2013
protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (!this.Request.Url.Host.StartsWith("www") && !this.Request.Url.IsLoopback)
    {
        var url = new UriBuilder(this.Request.Url);
        url.Host = "www." + this.Request.Url.Host;
        this.Response.RedirectPermanent(url.ToString(), endResponse: true);
    }
}
3 голосов
/ 10 августа 2013

Основываясь на ответе пользователя 151323, здесь приведен полный ответ для пользователей Azure, которые также хотят запретить пользователям доступ к сайту из субдомена azurewebsites.net (это относится к Global.asax внутри основного класса (MvcApplication для Пользователи MVC)):

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Url.Host.StartsWith("YourSite.azurewebsites") && !Request.Url.IsLoopback)
        {
            Response.StatusCode = 301;
            Response.AddHeader("Location", "www.YourSite.com");
            Response.End();

            return;
        }


        if (!Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
        {
            UriBuilder builder = new UriBuilder(Request.Url);
            builder.Host = "www." + Request.Url.Host;
            Response.StatusCode = 301;
            Response.AddHeader("Location", builder.ToString());
            Response.End();
        }
    }
2 голосов
/ 26 января 2018

Вы можете использовать для https и перенаправления www. (Вам нужно изменить «пример»)

<system.webServer>
  <!-- For force ssl and www -->
  <rewrite>
    <rules>
      <!-- For force ssl -->
      <rule name="http to https" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTPS}" pattern="^OFF$" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
      </rule>
      <!-- For force ssl -->
      <!-- For force www -->
      <rule name="redirect to www" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTP_HOST}"  pattern="^example\.com$" />
        </conditions>
        <action type="Redirect" url="https://www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
      </rule>
      <!-- For force www -->
    </rules>
  </rewrite>
  <!-- For force ssl and www -->
</system.webServer>
0 голосов
/ 05 июля 2015

Я знаю, что эта ветка древняя и, кажется, ответила на смерть. Но может быть полезно обернуть всеобщее предложение global.asax проверкой, работаете ли вы локально или нет. Таким образом, во время разработки с использованием IIS Express ваш сайт не будет пытаться перенаправить на поддомен «www».

Что-то вроде:

protected void Application_BeginRequest(
        object sender,
        EventArgs e)
    {
        if (!Request.IsLocal)
        {
            // Do your check for naked domain here and do permanent redirect
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...