为什么有的网站的域名有 www 前缀

安全咨询 0 550

如果你在网上冲浪的时候,有注意过地址栏,你会发现有的网站的域名有 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

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。