2010-02-13 6 views
2

Я пытаюсь заставить доменное имя не использовать «www». Я хочу перенаправить пользователя, если попытаюсь. Я мало что видел в решении MVC. В любом случае, нужно использовать маршрутизацию, встроенную в MVC, или какие лучшие решения.удалить 'WWW' в ASP.NET MVC 1.0

Благодаря

+0

Вы на Apache, IIS 6 или IIS 7? –

+0

IIS7, см. Ответ на свой пост. –

ответ

1

Если у вас есть контроль над сервером, вы должны создать виртуальный каталог, который принимает запросы на «www.domain.com» и постоянно перенаправляет (301) их «domain.com»

Хотя это может быть возможно в ASP.NET MVC, это не задача ASP для такого рода перенаправления.

В IIS: Virtual Directory http://img138.imageshack.us/img138/4213/virtualdirectories.png

На Apache:

<VirtualHost *:80> 
    ServerName www.domain.com 
    Redirect permanent/http://domain.com/ 
</VirtualHost> 

И IIS и настройки Apache сохранит стебель URL.

+0

Можете ли вы это сделать, сохранив URL-адрес пользователей. Я хочу, чтобы сайт был прозрачным для пользователя, а не просто отбросил их обратно до корня. –

+1

@ durilai: Если вы используете настройки на снимке экрана, который я только что добавил, вы получите именно этот эффект. Вот как я настроил свой сервер. Например, попробуйте перейти на http://www.lanlordz.com/Forums/ –

+0

Я использую discountasp.net, в то время как они позволяют подключиться к диспетчеру IIS, я не могу это изменить. Я бы предпочел этот метод, но не думаю, что это возможно на общем хосте. Есть предположения? –

4

Реализован как ActionFilter как MVC-подобный и более явный.

public class RemoveWwwFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var req = filterContext.HttpContext.Request; 
     var res = filterContext.HttpContext.Response; 


     var host = req.Uri.Host.ToLower(); 
     if (host.StartsWith("www.")) { 
      var builder = new UriBuilder(req.Url) { 
       Host = host.Substring(4); 
      }; 
      res.Redirect(builder.Uri.ToString()); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Примените ActionFilter к вашим контроллерам или классу базового контроллера, если он у вас есть.

Для ознакомления с действительными фильтрами см. Understanding Action Filters на MSDN.

[RemoveWwwFilterAttribute] 
public class MyBaseController : Controller 
+0

Это изменяет весь запрос, включая файлы сценариев и таблиц стилей, есть способ просто захватить представления. –

+2

Почему вы не используете для этого 'UriBuilder' и используете Request.Url? –

+0

@John Согласен, это лучший подход. –

3

Хотя я считаю, John Gietzen's ответ является наиболее элегантное решение, я не смог реализовать сделать в общей среде хостинга. Определенный для поиска решения, не связанного с приложением, я нашел это blog post, который показывает хороший альтернативный метод для IIS7. К счастью, у DiscountASP.NET есть модуль URL Rewrite, доступный через инструмент диспетчера IIS.

После этого сообщения в блоге о создании правила перезаписи любой URL-адрес с www в домене будет выполнять постоянную переадресацию 301 на сайт без www. Все, сохраняя все пути.

Спасибо за вклад каждого.

2

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

IIS Remove WWW

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