如果你在网上冲浪的时候,有注意过地址栏,你会发现有的网站的域名有 www 前缀,有的网站却没有。带 www 前缀的域名实际上是一个子域名,像cdndun88.com(我们官网)这样没有前缀的才是一个根域名。带和不带 www 的域名可以指向两个完全不同的网站,只是由于习惯,站长一般都会把带和不带 www 的域名指向同一个网站。
下面就来分别说一下带和不带 www 前缀的原因。
带 www 前缀的原因
1. 部分 DNS(域名解析服务)不支持在根域名上设置 CNAME 纪录
什么是域名解析服务和 CNAME 纪录?
当你访问一个域名时,浏览器需要查询到这个域名对应的 IP 地址,才能连接到服务器并取得数据。这个查询的过程叫做域名解析。指向网站的域名解析类型最常见的有 A 纪录和 CNAME 纪录。A 纪录填写的是 IP 地址,CNAME 纪录填写的是另一个域名,把那个域名的 IP 地址和其他纪录作为自己的纪录。当你使用虚拟主机或 CDN(内容分发网络)时,一般你需要设置一个 CNAME 纪录。
为什么不支持在根域名上设置 CNAME 纪录?
按照 DNS 标准,根域名是不可以设置 CNAME 的,但因为有这个需求,部分域名解析服务提供了在根域名设置 CNAME 的功能。即使你使用的域名解析服务允许你在根域名设置 CNAME,这也可能会导致 bug。
假设你有一个以你自己的域名结尾的邮箱(例如 a@example·com),并在根域名设置了一个用于邮箱的 MX 纪录,然后你又在根域名设置了 CNAME 纪录。当别人给你发邮件时,邮件可能会被发送到你的 CNAME 纪录指向的邮箱服务器,而不是你的 MX 纪录指向的服务器。如果你使用 www 子域名,你就可以在 www 子域名上设置 CNAME 纪录指向网站服务器,在根域名上设置 MX 纪录指向邮箱服务器。
CloudFlare 的域名解析服务有 CNAME Flattening 技术,通过自动把 CNAME 纪录转换成 A 纪录解决了上面说的和邮箱冲突的问题,但 CNAME Flattening 也有其他问题:当你的根域名使用的 CDN 不是 CloudFlare 自家的,且不支持 IP Anycast 时,由于这些 CDN 在不同地区解析出的 IP 地址不同,当 CloudFlare 获取 IP 地址时,这些 CDN 以为访客在美国(因为 CloudFlare 的回源服务器在美国),从而提供美国的 IP 地址,而不是离访客实际位置最近的 IP 地址,这可能会导致网站访问速度变慢。所以一般国内用CF都很慢,有网友调侃CF那是减速器吧。
2. 在根域名上设置的 Cookie 会被发送给该域名下的所有子域名
什么是 Cookie?
Cookie 是网站为了辨别访客身份而存储在浏览器上的数据,通常包含账号登录信息。一个网站设置 Cookie 后,每次访问这个网站时,浏览器都会把 Cookie 发送给这个网站。
Cookie 会被发送给所有子域名存在什么问题?
一般情况下,网站上的静态资源(所有人每次访问都是一样的资源,例如图片、样式表和脚本)是不需要 Cookie 的,但当浏览器在请求它们时,也会带上 Cookie 数据。对于不需要传输的数据,能不传输,就不传输,所以如果根目录存在 Cookie,为了不给静态资源发送 Cookie,一般会通过使用另一个域名来提供静态资源。
为什么要用 www 子域名?
由于 Cookie 会被发送给子域名,所以如果你使用根域名,你需要再买一个域名来提供静态资源,GitHub 就是这么做的:他们没有使用 www 子域名,而是再买了个 githubassets·com 来专门提供网页上的静态资源。如果你使用 www 子域名,你则可以用同一个域名下的另一个子域名来提供静态资源。假设你的域名是 example·com,且你使用 static·example·com 来提供静态资源,static·example·com 会收到 example·com 的 Cookie,而不会收到 www·example·com 的 Cookie,因为 static·example·com 和 www·example·com 是同级的。
3. 用通配符匹配全部子域名更简单
当你想匹配 example·com 下的全部域名时,如果 example·com 的主站使用 www 前缀,那么你只要写 *·example·com 就可以了;如果 example·com 的主站没有使用 www 前缀,那么你要再多写一个根域名:*·example·com example·com。
4. 一看就知道是个域名
对于常见域名后缀,例如 ·com、·cn 和 ·net,不存在这个问题,但如果你的域名有个小众的后缀,例如 ·company、·studio 和 ·tools,如果没有 www 前缀,别人可能不知道这是个域名。一些社交软件也需要有 www 前缀才会识别到这些域名。当然,在域名前面加上协议(https://)可以让人和软件都识别出这是个域名,但和输入 www· 相比,输入 https:// 要输更多的符号,在手机上可能会更麻烦。
5. 为将来考虑
即使你现在不使用域名邮箱、不使用 CDN、不使用 Cookie,或者你现在的配置可以完美实现你的需求,但在将来你需要实现一些东西的时候,可能会受到限制。当然,对于这些限制,都是有变通方法的,所以也不是说必须要用 www 前缀。
不带 www 前缀的原因
1. 减少重定向次数
现在越来越多的人在浏览器地址栏输入域名的时候不会输 www 前缀了。当你第一次访问一个使用 www 前缀的网站时,例如百度,如果你在地址栏中输的是 baidu·com,浏览器请求到 baidu·com 的 IP 地址并连上服务器后,服务器会告诉浏览器要把域名改成 www·baidu·com,然后重新再来请求(要重新请求是因为带和不带 www 前缀可以是两个完全不同的网站);然后浏览器要重新请求 www·baidu·com 的 IP 地址并再次连上服务器后,才会展示出页面内容。这个重定向过程通常是很快的、访客感觉不到速度差别的,但是在一些很差的网络环境下还是会有差别的。如果网站不用 www 前缀,在访客没有输 www 前缀时,浏览器不需要重定向就可以直接展示出页面内容了。
可以在强制 HTTPS 的同时重定向到 www 前缀吗?
可以,但是如果这个强制 HTTPS 的逻辑不是你自己设置的,而是直接开启「强制 HTTPS」的开关,或者你需要 HSTS Preload(申请时要求网站重定向到 HTTPS 页面时不能改域名),那么当访客直接在地址栏输入根域名时,浏览器(如果没有 HSTS Preload)会重定向两次:从没有 HTTPS 且没有 www 前缀的重定向到有 HTTPS 但没有 www 前缀的,然后再重定向到有 HTTPS 且有 www 前缀的。
2. 减少网址在地址栏占用的空间
当你的域名本身就很长时,如果再加上 www 前缀,可能在手机上的地址栏中都不能完整地显示了。不过现在部分浏览器,例如 Chrome 和 Safari,会隐藏地址栏中的 www 前缀,所以这不是个大问题。
不管要不要 www 前缀,都应该设置重定向
如果你选择根域名,就把 www 子域名 301 重定向(301 即永久重定向)到根域名;如果你选择 www 子域名,就把根域名 301 重定向到 www 子域名。重定向可以确保访客不管有没有输 www 前缀都可以访问你的网站。
小孩子才做选择,我可以两个都要吗?
不建议,因为:
1. 根域名和 www 子域名无法共享缓存
假设访客第一次访问了 example·com,第二次访问了 www·example·com。即使它们的内容是相同的,对于浏览器来说,用户访问的是两个不同的网站,且都是第一次访问,没有缓存可用,所有资源都要从服务器下载,这减慢了第二次访问时的网页加载速度。
2. 不利于 SEO,搜索引擎不知道你的网站要不要 www 前缀
这可能导致搜索引擎收录的链接里有的有 www 前缀,有的没有。当一个搜索引擎蜘蛛来到你的网站时,在固定的时间内,你希望它收录网站上的更多页面,而不是相同页面在不同域名的版本。如果有特殊原因不能重定向,也应该在 HTML 里通过 <link rel="canonical" href="网址"> 告诉搜索引擎你想不想要你的网站的域名在搜索结果里带 www 前缀。
3. 失去了 www 子域名的优势
前面说的 www 子域名的优势是以网站不使用根域名(根域名只重定向)为前提的。两个都要就意味着你可能会遇到根域名的那些限制。
留言0