问题
CNAME 记录一般情况是不能设置 www 和根域名同时适配的,只能添加 www 记录,为了解决这个问题,就需要用到边缘 JavaScript 。
解决
边缘 JavaScript
很多 cdn 商家都提供边缘 JavaScript 的功能。
- 比如 Cloudflare ,就提供一个 workers 功能,可以让用户在访问到源站前执行一个边缘的 JavaScript 脚本(在 cdn 的节点上执行),这就为很多操作提供了可能,比如跳转。
- 比如阿里云也有 EdgeRoutine 功能,是一个边缘 Serverless 计算环境,也可以提供边缘的 JavaScript,其他商家自行探索。
下面就简单介绍下 Cloudflare 的边缘 js 功能,因为他是不收费也可以使用的。
使用 workers
- 先切换到 workers 栏,管理 workers 并添加一个脚本。
- 编辑你的 js 脚本代码如下:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
/**
* Respond to the request
* @param {Request} request
*/
async function handleRequest(request) {
const init = {
headers: {
'content-type': 'text/html;charset=UTF-8',
},
}
return new Response(renderHTML(), init);
}
function renderHTML() {
return `<!DOCTYPE html>
<script>
window.location.href = 'https://domain.com'
</script>`
}
函数 | 作用 |
---|---|
addEventListener | 脚本自带的,提供一个类似 fetch api |
handleRequest | 需要异步执行,并且给 html 响应头,否则返回的是纯文本 |
renderHTML | 返回 html 页面,并给出跳转 |
-
管理路由,进入添加一条 www 规则的路由,再添加一条根域名的路由。
-
用 A 记录解析主域名与 www 域名,必须要解析 ip 地址才能运行边缘 js,否则 dns 上都没有这条记录是没法分发到 cdn 节点执行 js 的,当然,解析的 ip 随意,比如 8.8.8.8 。
至此就可以等待解析生效访问根域名与 www 域名进行跳转了,当然,不同的 js 也可以做不同的事情,有什么需求就写什么 js ,甚至识别不同 url 做手动分发等。
思考
- 可以用边缘 js 来做很多事情,比如博客,当然,要自己规划资源,毕竟免费版只提供一个 js 可写,所有的内容都要包括,付费版可以有自己的存储空间。
- cdn 是可以一定程度上防 d 的,或者安排自己的防火墙规则,这是好处。
- cloudflare 是减速器,人人皆知,这是坏处。
- cloudflare 偶尔炸过,毕竟是免费的服务,可以选择购买付费版(昂贵)。
其他
可能说只为了跳转这个需求的话,那直接做 url 重定向或者 301/302 就好了,话虽如此,如果域名还配备了域名邮箱服务的二级 CNAME 记录的话,就不能用全站跳转,也就是说,这种方式可以很好的实现有其他二级域名提供服务的同时只对我们需要的进行跳转。