使用nginx進行裸域名的跳轉

裸域名也就是在域名註冊商處申請得到的頂級域名,比如本站的域名meiweier.com。www、blog這些前綴都是子域名,也叫二級域名。普 通用戶訪問網站的通常習慣是在瀏覽器的地址欄輸入www.***.***,其實訪問的是一個二級域名。對於域名解析來說,頂級域名也是可以被直接訪問的, 設定好解析後在web server上配置即可。但通常我們並不這樣做,特別是在中國,大部分普通用戶認爲訪問網站是必須要輸入www的。沒辦法,用戶的習慣就是這樣,我門必須迎合之。

那當用戶訪問裸域名的時候怎麼辦呢?如果允許用戶直接訪問裸域名,可能會帶來一個潛在問題,這個問題針對的是有用戶系統的網站。通常,網站的用戶系統依賴的是瀏覽器的cookies,而cookies是區分域的,頂級域名和二級域名會被認爲是兩個不同的域。

拿本站舉例來說,用戶使用裸域名meiweier.com訪問,並使用帳號登錄,當他再次使用二級域名www.meiweier.com訪問的時候,他並沒有在登錄狀態,並且可以在 登錄一次。這對普通用戶來說可能會造成迷惑,不好。另外,一個網站同時使用裸域名和二級域名也不利於SEO。所以我希望用戶訪問裸域名的時候自動跳轉到二 級域名www,就像豆瓣網,訪問douban.com自動跳到www.douban.com一 樣。

我使用HttpFox跟蹤了一下douban的跳轉過程,在瀏覽器中訪問douban.com,HTTP請求過程截圖如下:

豆瓣網裸域名跳轉

可以看出,它是通過執行服務器端跳轉(HTTP 302)來實現的。據此,首先想到的方法是,通過程序控制,檢查用戶訪問的地址,如果是裸域名,則自動執行跳轉。很明顯,這個方法並不優雅,還會增加應用 程序的負擔。由於meiweier.com使用的nginx,於是想到nginx有沒有提供類似的功能。通過google,在一篇國外的blog上找到了方法,只是我要做的和他正好相反,但原理是一樣的。在配置文件的server節增加如 下腳本:

if ($host != 'www.meiweier.com' ) {
        rewrite    ^/(.*)$    http://www.meiweier.com/$1    permanent;
}

重啓nginx即可,夠簡單吧!

意外的收穫,訪問我的另外一個域名www.meiweier.net也 被自動跳轉到www.meiweier.com了。不過這個結果,從上面 腳本就可以中看出來了。

nginx真是強大!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章