2011-02-03 4 views
2

Как удалить www. от входящих запросов? Нужно ли настраивать 301 перенаправление или просто переписать путь? В любом случае, что это лучший способ сделать это?Как удалить www. префикс в ASP.NET MVC

Спасибо!

+0

Почему вы просто не добавили CNAME, который указывает 'www.domain.com' на' domain.com'? –

+0

* Где * вы хотите удалить его? Вы хотите удалить его * в своем приложении *? Или вы хотите, чтобы ваши пользователи * никогда не видели «www». адрес, даже если они печатают его? –

+1

@Mauricio, что я хочу, даже когда они печатают на www, я хочу его удалить. – Micah

ответ

7

Я считаю, что было бы более целесообразно сделать это с помощью модуля перезаписи URL-адресов IIS.

Если у вас есть доступ к инструменту управления IIS, есть GUI для настройки правил перезаписи в разделе «IIS» настроек вашего сайта. Если вы выберете «Добавить правило (ы) ...» оттуда (в меню правого столбца), выберите правило «Каноническое имя домена» в разделе SEO, чтобы почти полностью автоматизировать настройку правила.

Если нет, то правило перезаписи будет выглядеть в вашем web.config:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="CanonicalHostNameRule1"> 
       <match url="(.*)" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="^yourdomain\.com$" negate="true" /> 
       </conditions> 
       <action type="Redirect" url="http://yourdomain.com/{R:1}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 
+0

Мне, должно быть, что-то не хватает. Если я вставляю это в свой web.config, я получаю «HTTP Error 500.19 - Внутренняя ошибка сервера Запрошенная страница недоступна, потому что связанные данные конфигурации для страницы недействительны». Я удаляю раздел перезаписи, все работает снова. Любые идеи, что мне здесь не хватает? – Kjensen

+1

@Kjensen: Убедитесь, что у вас установлено расширение Rewrite URL. Вы можете получить его здесь: http://www.iis.net/download/urlrewrite –

2

Вы можете обрабатывать Application.BeginRequest событие и проверить, является ли Request.Host начинается с www.
Если это так, позвоните Response.RedirectPermanent и передайте URL-адрес с указанием пути и голого домена.

Вы можете построить новый URL-адрес, написав

"yourdomain.com" + Request.Url.PathAndQuery 
2

Я нашел отличное решение здесь: http://nayyeri.net/remove-quotwwwquot-from-urls-in-asp-net

public class RemoveWWWPrefixModule : IHttpModule 
{ 
    public void Dispose() { } 

    private static Regex regex = new Regex("(http|https)://www\\.", RegexOptions.IgnoreCase | RegexOptions.Compiled); 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication application = sender as HttpApplication; 
     Uri url = application.Context.Request.Url; 
     bool hasWWW = regex.IsMatch(url.ToString()); 

     if (hasWWW) 
     { 
      String newUrl = regex.Replace(url.ToString(), 
      String.Format("{0}://", url.Scheme)); 
      application.Context.Response.RedirectPermanent(newUrl); 
     } 
    } 
} 
0

Это более общий характер конфигурации, как вы можете написать его один раз в URL переписывания корневой IIS (не определенный для определенного пула приложений), и он будет автоматически применяться ко всем вашим сайтам IIS без какой-либо зависимости от вашего доменного имени.

IIS Remove WWW

1

Вы можете использовать следующее правило перезаписи в файле web.config.

Это правило перезаписи удалит WWW, а также сохранит обратный URL и инициирующий протокол.

<rewrite> 
     <rules> 
      <clear/> 
      <rule name="Canonical host name" enabled="true"> 
       <match url="(.*)"/> 
       <conditions trackAllCaptures="true"> 
        <add input="{HTTP_HOST}" negate="false" pattern="^www\.(.+)$"/> 
        <add input="{CACHE_URL}" pattern="^(.+)://" /> 
       </conditions> 
       <action type="Redirect" url="{C:2}://{C:1}{REQUEST_URI}" appendQueryString="false" redirectType="Permanent"/> 
      </rule> 
     </rules> 
    </rewrite> 
0

Гораздо проще было бы создать фильтр действий и украсить свое действие им.

public class RemovePrefix : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
       var url = filterContext.HttpContext.Request.Url.ToString().Replace("http://www.", "http://"); 
       filterContext.Result = new RedirectResult(url); 

    } 
} 
Смежные вопросы