裸域名也就是在域名注册商处申请得到的顶级域名,比如本站的域名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请求过程截图如下:

使用nginx进行裸域名的跳转_裸域名

可以看出,它是通过执行服务器端跳转(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真是强大!