故事是這樣:有個客戶給了我一個子網域(假設它叫 ap.veronica.idv.tw 好了),讓我放一個活動網站在上頭。隔了一陣子以後,客戶覺得這個子網域不夠望文生義,所以又設了一個子網域(假設叫做 coolsite.veronica.idv.tw),同時給我另一個空間,要我把網站複製一份過去,這麼一來如果 coolsite.veronica.idv.tw 運作有問題,他只要把首頁上的活動網站連結改成指向 ap.veronica.idv.tw 就好了。

事隔一年半載以後,客戶寫信給我,問我為什麼同時可以在 Google 的搜尋結果看到 ap.veronica.idv.tw 和 coolsite.veronica.idv.tw,我解釋是因為兩台機器都還存在的關係,所以搜尋引擎自然能夠搜爬到兩個網址的內容。

他告訴我,因為 ap.veronica.idv.tw 已經經營一段時間,因此他怕還有使用者會透過這個網址連到網站。為了讓這些人不迷路,他問我短期內有沒有可能還是能繼續使用舊域名連結到網站?

原本是打算在 ap.veronica.idv.tw 做一個「我們已經搬家囉」的頁面,不過,考慮到要改善搜尋引擎結果,因此我選擇送出 HTTP 301 狀態碼。

HTTP 301 會通知搜尋引擎機器人網站已永久轉移到目標網址,按照規範走的搜尋引擎就會根據 HTTP 301 轉向的網址,來更新他的搜尋結果。

先在 web.config 檔,將新的站址定義為 AppSettings 的字串,以便程式應用與日後修改:

<add key="URL301Location" value="coolsite.veronica.idv.tw"/>

接著,在 App_Code 資料夾,新增一支程式 RedirectNewDomain .cs:

using System;
using System.Web;
using System.Configuration;

namespace
 Domain
{

    /// <summary>
    /// 送出 HTTP 301 永久轉址
    /// </summary>
    public class RedirectNewDomain : IHttpModule
    {
        public void Dispose()
        {
        }
        public void Init(HttpApplication context)
        {
            context.AuthorizeRequest += (new EventHandler(Process301));
        }
        public void Process301(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            HttpRequest request = app.Context.Request;
            string lRequestedPath = request.Url.DnsSafeHost.ToString();
            string strWebURL = ConfigurationManager.AppSettings["URL301Location"].ToString();
            if (lRequestedPath.IndexOf(strWebURL) == -1)
            {
                app.Response.StatusCode = 301;
                app.Response.AddHeader("Location",
                    request.Url.Scheme + "://" + strWebURL + request.RawUrl.ToString().Trim());
            }
        }
    }
}

最後再回到 web.config,在 httpModules 區段加上設定:

<httpModules>
      <add name="Domain" type="Domain.RedirectNewDomain" />
</httpModules>

 

將程式加上去後,使用者瀏覽 ap.veronica.idv.tw/test.html,會自動被帶到 coolsite.veronica.idv.tw/test.html,每一個頁面都以此類推。由於實際上客戶家的網站,算是 Google 滿常來爬的網站(網址當然不是 veronica.idv.tw XD),所以我記得隔天就已經不會在搜尋結果中看到 ap.veronica.idv.tw 的內容了,全都剩下 coolsite.veronica.idv.tw 的內容啦。

如果你的網站是 ASP.NET MVC,可以參考保哥的《ASP.NET MVC 開發心得分享 (14):實做 HTTP 301 永久轉向》

 

附帶一提這是先前在痞客幫 (Pixnet) 換網址事件學會的。早期的痞客幫部落格網址是長成 http://blog.pixnet.net/fannys23 這個樣子,後來讓每個使用者的帳號名稱都能成為獨立子網域,也就是像 http://fannys.pixnet.net 這種格式。為了改善搜尋引擎查找結果,所以痞客幫有特別送出 HTTP 301 轉向。詳情可以參考 gslin 的《301 Permanent Redirect 代表的意義》

 

--
(2013/04/09 update)

今天看到一篇名為《 [問卦] 這十年消失的軟體/網站?》的文章,裡面推文有人開玩笑說「總統府網站消失6年了」,不知道對方指的是什麼,我想到的是 www.oop.gov.tw 已經有很長時間無法連上。其實這也只要設定送出 HTTP 301/302 就可以解決。

是說我以為預設情況下,多數人設定 DNS 時,應該會把「有 www」和「沒有 www」的域名指向同一個頁面。比方說,在網址列輸入 google.com 和 www.google.com,都會指向 Google 首頁。很多大型站台也是這麼做。但是 www.president.gov.tw 和 president.gov.tw 也沒有指向同一頁面,這顯然也不是大家設定 DNS 時的共識/常識。(笑)

arrow
arrow

    小攻城師 發表在 痞客邦 留言(0) 人氣()