2010-02-13 68 views
2

我试图强制域名不使用'www'。我想要尝试重定向用户。我很少看到MVC解决方案。无论如何要利用MVC内置的路由,或者最好的解决方案是什么。在ASP.NET MVC 1.0中删除'WWW'

感谢

+0

您在Apache,IIS 6或IIS 7上吗? – 2010-02-13 03:43:07

+0

IIS7,请参阅您的帖子上的回复。 – 2010-02-13 04:04:45

回答

1

如果你有对服务器的控制,你应该建立一个接受请求“www.domain.com”,并永久重定向(301)的虚拟目录他们“domain.com”

虽然这可能是可能在ASP.NET MVC,这不是ASP的工作做这种重定向。

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

在阿帕奇:

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

无论是IIS和Apache设置将保留URL干。

+0

你可以做到这一点,同时保留用户的网址。我想透明地将www放到用户,而不是将他们踢回根。 – 2010-02-13 03:32:43

+1

@durilai:如果您使用刚才添加的屏幕快照中的设置,您将获得完全相同的效果。这是我如何配置我的服务器。例如,尝试去http://www.lanlordz.com/Forums/ – 2010-02-13 03:40:15

+0

我使用discountasp.net,而他们允许连接到IIS管理器我无法修改此。我更喜欢这种方法,但不认为这是可能的共享主机。有什么想法吗? – 2010-02-13 03:52:29

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应用于您的控制器或基础控制器类(如果有的话)。

有关Action Filters的介绍,请参见MSDN上的Understanding Action Filters

[RemoveWwwFilterAttribute] 
public class MyBaseController : Controller 
+0

这将修改所有请求,包括脚本和样式表文件,是否有办法捕获视图。 – 2010-02-13 03:37:26

+2

为什么你不使用'UriBuilder'来实现这个功能,并使用Request.Url? – 2010-02-13 03:49:28

+0

@John同意,这是一个更好的方法。 – 2010-02-13 04:16:42

3

尽管我相信John Gietzen's答案是最优雅的解决方案,但我无法实现共享主机环境。确定找到一个非应用程序驱动的解决方案,我发现这blog post显示IIS7的一个很好的替代方法。谢天谢地,DiscountASP.NET的URL Rewrite模块通过IIS管理器工具提供。

关于创建重写规则的博客文章之后,域中的www任何URL都将永久301重定向到非www网站。同时保留完整路径。

感谢大家的意见。

2

这是更通用的配置,因为您可以在URL中写入一次重写根IIS(并非特定于某个应用程序池),它将自动应用于所有IIS网站,而不依赖于您的域名。

IIS Remove WWW