2011-02-03 60 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); 

    } 
}