2009-02-06 22 views
14

我正在使用ASP.NET 2.0 C#。我想重定向爲我用 「www」 的Web應用程序的所有請求,沒有 「www」 的如何使用「www」URL來重定向而不使用「www」URL或反之亦然?

www.example.com改爲example.com

或者

example.com到www.example.com

Stackoverflow.com已經在做這個,我知道在PHP(.htaccess)文件中有一個預製機制。但如何在asp.net中做到這一點?

謝謝

+1

這就是所謂的「規範名稱」如果你想看看它在其他地方。 – 2009-02-06 19:46:49

+3

重要的是要知道,如果你不使用www(或其他子域名),那麼所有的cookie將被提交給每個子域名,你將無法使用無cookie的子域名來提供靜態內容,從而減少瀏覽器和服務器之間來回傳送的數據量。你後來可能會後悔的事:http://twitter.com/codinghorror/statuses/1637428313 – 2009-04-28 23:45:55

+1

@Diodeus - 我們真的需要一個標籤嗎? – theycallmemorty 2009-07-14 20:59:01

回答

6

我以前用以下解決方案時,我無法修改IIS設置。

要麼在一個HTTPModule(可能是最乾淨的)或Global.asax.cs在Application_BeginRequest或在一些BasePage類型的事件,如OnInit我執行檢查請求的網址,與我希望使用已知的字符串:

public class SeoUrls : IHttpModule 
{ 
    #region IHttpModule Members 

    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += OnPreRequestHandlerExecute; 
    } 

    public void Dispose() 
    { 
    } 

    #endregion 

    private void OnPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
    HttpContext ctx = ((HttpApplication) sender).Context; 
    IHttpHandler handler = ctx.Handler; 

    // Only worry about redirecting pages at this point 
    // static files might be coming from a different domain 
    if (handler is Page) 
    { 
     if (Ctx.Request.Url.Host != WebConfigurationManager.AppSettings["FullHost"]) 
     { 
     UriBuilder uri = new UriBuilder(ctx.Request.Url); 

     uri.Host = WebConfigurationManager.AppSettings["FullHost"]; 

     // Perform a permanent redirect - I've generally implemented this as an 
     // extension method so I can use Response.PermanentRedirect(uri) 
     // but expanded here for obviousness: 
     response.AddHeader("Location", uri); 
     response.StatusCode = 301; 
     response.StatusDescription = "Moved Permanently"; 
     response.End(); 
     } 
    } 
    } 
} 

然後註冊在你的web.config類:

<httpModules> 
    [...] 
    <add type="[Namespace.]SeoUrls, [AssemblyName], [Version=x.x.x.x, Culture=neutral, PublicKeyToken=933d439bb833333a]" name="SeoUrls"/> 
</httpModules> 

這種方法工作得很好了我們。

24

有一個關於這個的Stackoverflow博客文章。

http://blog.stackoverflow.com/2008/06/dropping-the-www-prefix/

引用傑夫:

這裏的IIS7規則,所有傳入網址中刪除WWW 前綴。剪切和 這個XML片段粘貼到您的 web.config文件下

<system.webServer>/<rewrite>/<rules> 

<rule name="Remove WWW prefix" > 
<match url="(.*)" ignoreCase="true" /> 
<conditions> 
<add input="{HTTP_HOST}" pattern="^www\.domain\.com" /> 
</conditions> 
<action type="Redirect" url="http://domain.com/{R:1}" 
    redirectType="Permanent" /> 
</rule> 

或者,如果你喜歡使用www前綴 ,你也可以這樣做:

<rule name="Add WWW prefix" > 
<match url="(.*)" ignoreCase="true" /> 
<conditions> 
<add input="{HTTP_HOST}" pattern="^domain\.com" /> 
</conditions> 
<action type="Redirect" url="http://www.domain.com/{R:1}" 
    redirectType="Permanent" /> 
</rule> 
0

這通常由您的Web服務器在配置中直接處理。正如您所提到的,.htaccess文件爲Apache Web服務器執行此操作 - 它與PHP無關。由於您使用的是ASP,因此您的服務器就是IIS。我知道有一種方法可以直接使用IIS進行設置,但我不知道它是什麼。您可能會因爲知道您應該搜索與「IIS重定向」相關的內容而不是「ASP重定向」的幫助而在搜索中獲得幫助。

也就是說,你可以在PHP中執行它,幾乎可以肯定是ASP,但是你必須在錯誤的域中打任何URL才能調用執行重定向操作的ASP腳本(使用適當的API調用或通過直接設置標題)。這將需要一些URL重寫或服務器上的某些部分,以便所有錯誤主機上的URL都由您的腳本處理...只需在服務器上首先執行:)

0

我們這樣做了在IIS 6上很簡單。 我們從本質上創建了第二個虛擬服務器,它與自定義404頁面.aspx頁面上沒有任何關係。 本頁面通過將URL更改爲www.whateverserver.com/whateverpage.aspx,將任何關於WHATEVERSERVER.com/whateverpage.aspx的請求都重定向到真實服務器。

設置起來非常簡單,它的優點是它可以與任何進入它的域一起工作(如果您有多個域),而無需爲每個域設置額外的規則。因此,對www.myoldserver.com/xxx的任何請求也將重定向到www.whateverserver.com/xxx

在IIS 7中,所有這些都可以使用URL編寫組件完成,但我們寧願保持重定向關閉在這個虛擬服務器上。

5

接受的答案適用於單個URL或少數幾個,但我的應用程序提供數百個域名(有太多的URL需要手動輸入)。

這是我的IIS7 URL重寫模塊規則(這裏的動作類型實際上是301重定向,而不是「重寫」)。偉大的作品:

<rule name="Add WWW prefix" > 
    <match url="(.*)" ignoreCase="true" /> 
    <conditions> 
    <add input="{HTTP_HOST}" negate="true" pattern="^www\.(.+)$" /> 
    </conditions> 
    <action type="Redirect" url="http://www.{HTTP_HOST}/{R:1}" 
     appendQueryString="true" redirectType="Permanent" /> 
</rule> 
2

爲了回答這個問題,我們首先要回顧一下WWW的定義:

萬維網: ñ。縮寫。 WWW

  • 位於所有使用HTTP協議的Internet服務器上的文檔的完整集合,可通過簡單的點擊式系統訪問。
  • n:通過超文本傳輸​​協議提供文本和圖形以及聲音和動畫資源的網站集合。 默認情況下,所有流行的Web瀏覽器都採用HTTP協議。這樣做時,軟件會在所請求的URL前面加上'http://',並自動連接到端口80上的HTTP服務器。爲什麼許多服務器要求他們的網站通過www子域進行通信?郵件服務器不要求您將電子郵件發送到[email protected]。同樣,Web服務器應允許通過主域訪問其頁面,除非需要特定的子域。

簡而言之,使用www子域是冗餘且耗時的通信。沒有它,互聯網,媒體和社會都會變得更好。

使用頁面頂部的鏈接,您可以查看最近驗證的域以及提交域進行實時驗證。

Apache服務器:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

的Windows Server/IIS: 沒有辦法。

您可以使用Url Rewriter from Code Plex。使用相同的語法。

RewriteCond %{HTTP_HOST} !^(www).*$ [NC] 
RewriteRule ^(.*)$ http://www.%1$1 [R=301] 

Source

0

如果你使用的是IIS 7,只需導航到URL重寫,並添加規範域名規則。

P.S.它確保您從domain.com重定向到www.domain。COM

0

這個版本將:

  1. 維護HTTP/HTTPS傳入請求的。
  2. 支持各種主機以防萬一需要(例如,多租戶應用程序按區域區分租戶)。

<rule name="Redirect to www" stopProcessing="true"> 
    <match url="(.*)" /> 
    <conditions trackAllCaptures="true"> 
    <add input="{CACHE_URL}" pattern="^(.+)://" /> 
    <add input="{HTTP_HOST}" negate="true" pattern="^www\.(.+)$" /> 
    </conditions> 
    <action type="Redirect" url="{C:1}://www.{HTTP_HOST}/{R:1}" /> 
</rule> 
相關問題