2011-02-03 42 views
2

如何删除www。来自传入的请求?我是否需要设置301重定向或者只是重写路径?无论哪种方式,最好的方法是什么?如何删除www。 ASP.NET MVC中的前缀

谢谢!

+0

为什么你不只是添加CNAME,指出`www.domain.com`为`domain.com`? – 2011-02-03 03:51:52

+0

*您要删除它吗?你想在应用程序*中删除它吗?或者你想*你的用户*永远不会看到“www”。即使他们键入它的地址? – 2011-02-03 03:53:18

回答

7

我相信用IIS的URL重写模块做这件事更合适。

如果您有权访问IIS的管理工具,则可以在网站设置的“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> 
2

您可以处理Application.BeginRequest事件,并检查是否Request.Host开始与www
如果是这样,请致电Response.RedirectPermanent,并传递一个包含请求路径和裸域的URL。

您可以通过编写

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

构建新的URL我发现了一个很好的解决方案在这里: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); 

    } 
}