开发人员使用域名,和普通用户的需求差别很大。普通用户只要输入网址能打开页面就行,开发者要关注域名绑定对象、解析目标、证书有效性、跨域配置等内容。这类问题平时不会显现,一旦出问题,很容易直接造成线上故障。
本地开发修改hosts,是很多开发者最先碰到的坑。本地启动服务,想用api.myapp.com这类域名访问,而不是localhost:3000,就要编辑hosts文件。Mac和Linux系统路径为/etc/hosts,Windows系统路径是C:WindowsSystem32driversetchosts。添加一行127.0.0.1 api.myapp.com,浏览器访问这个域名就会指向本机。调试OAuth回调、Cookie作用域、跨域请求时这个操作很实用,很多第三方服务回调地址不接受localhost,必须填写标准域名。

Cookie的domain属性和域名绑定紧密。设置domain=.myapp.com,api.myapp.com和www.myapp.com都可以读取这条Cookie。如果设置成domain=api.myapp.com,www.myapp.com就无法读取。还有一个麻烦点,.myapp.com和myapp.com在多款浏览器里处理逻辑存在差异。跨子域共享登录态时忽略这个细节,会出现很难复现的bug:主站登录成功,API子域拿不到Cookie,用户莫名退出登录。
跨域请求的判断依据是域名,不是IP。浏览器同源策略会比对协议、域名、端口三项内容。https://api.myapp.com和https://www.myapp.com属于两个独立源,发起请求就会触发跨域。后端配置CORS,开启Cookie传递的情况下,Access-Control-Allow-Origin不能填写*,需要填写具体源地址。很多开发者本地用localhost:3000对接后端api.myapp.com,遇到跨域报错,误以为后端配置出错,本质是域名不一致,浏览器拦截了请求。
子域名是开发者常用的环境隔离手段。dev.myapp.com分配给开发环境,staging.myapp.com用作预发布环境,api.myapp.com承载接口服务,cdn.myapp.com托管静态资源。各个子域名可以指向不同服务器、CDN和证书。子域名不需要单独注册,只需要在主域名下新增一条DNS记录。但要留意泛解析*.myapp.com,虽然配置简单,安全层面存在隐患。泛解析代表任意前缀都能解析到服务器,随机前缀的访问请求到达后,服务器需要做好处理,防止内部服务暴露。
SSL证书绑定域名,不是绑定IP。为myapp.com申请的证书,默认不会覆盖api.myapp.com,除非申请*.myapp.com通配符证书。通配符证书只覆盖一级子域,a.b.myapp.com不在证书保护范围内。Let's Encrypt免费证书签发速度快,但有效期只有90天,需要配置自动续期。大量线上故障都是证书过期导致,浏览器直接拦截访问,用户无法打开页面。设置定时任务监控证书到期时间,提前30天完成续期,远比故障后紧急修复稳妥。
DNS解析的TTL值,在开发阶段经常被忽略。TTL代表缓存时长,单位是秒。修改DNS记录之后,递归服务器还保留旧缓存,用户访问依旧读取旧地址。TTL设置偏小,比如60秒,记录变更生效更快;TTL设置偏大,比如3600秒,可以降低递归服务器压力,解析速度更快。生产环境一般设置300至600秒,切换记录前先调低TTL,变更完成再调回原值,属于基础运维操作。如果使用Cloudflare代理模式,TTL由系统自动控制,无法手动修改,想要自定义TTL需要先关闭代理。
CNAME记录不能和其他记录共存。域名配置CNAME指向myapp.cdnprovider.com,就不能再添加A记录或是MX记录,这是DNS协议自带限制。接入CDN时经常要求添加CNAME,若根域名myapp.com已经配置MX用来接收邮件,就会产生冲突。解决方案是使用子域名cdn.myapp.com添加CNAME,根域名保留A记录,或是启用CNAME拉平。Cloudflare的CNAME flattening就是实现这个功能,在根域名模拟CNAME效果,实际返回A记录。
API调用的域名鉴权,也是开发经常接触的域名相关配置。不少第三方服务会分配API key,限制密钥仅允许指定域名发起请求。Google Maps API key就可以限制仅放行myapp.com和*.myapp.com的请求。本地开发时请求源是localhost,密钥校验会失败。处理方式有两种,在Google Cloud Console里把localhost加入白名单,或者修改hosts,将dev.myapp.com指向本地,模拟真实域名环境。
域名解析调试工具需要掌握。dig和nslookup是命令行常用工具。执行dig api.myapp.com,可以查看解析结果、TTL以及对应的记录类型。dig +trace api.myapp.com能够展示从根服务器开始完整的解析链路,排查解析异常很实用。Windows优先使用nslookup,macOS和Linux环境下dig体验更好。在线工具dnschecker.org可以查询全球各地解析结果,判断是否存在区域性DNS缓存未刷新的问题。
域名注册完成不等于万事大吉。一定要设置续费提醒,开启自动续费。域名一旦过期被别人抢注,对应的API、CDN、SSL证书、邮件服务全部失效。域名找回的成本,远高于几十元的续费费用。开发环境使用的子域名不用单独续费,但主域名失效,所有子域名都会一并失效。这件事没有复杂技术门槛,但每年都有企业踩坑。