惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
IT之家
IT之家
月光博客
月光博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
The GitHub Blog
The GitHub Blog
宝玉的分享
宝玉的分享
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
博客园 - 【当耐特】
I
Intezer
Recorded Future
Recorded Future
C
Cisco Blogs
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
L
Lohrmann on Cybersecurity
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tenable Blog
U
Unit 42
Google Online Security Blog
Google Online Security Blog
Attack and Defense Labs
Attack and Defense Labs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
SecWiki News
SecWiki News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
MongoDB | Blog
MongoDB | Blog
博客园 - 司徒正美
博客园_首页
N
News | PayPal Newsroom
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cisco Talos Blog
Cisco Talos Blog
Project Zero
Project Zero
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
Schneier on Security
Schneier on Security
V
Vulnerabilities – Threatpost

Dvel's Blog

Rime 全拼双拼混输 CHD 油猴脚本:每日签到自动答题 Rime 配置:雾凇拼音 Hammerspoon 自动切换输入法 修复 Hugo 本地图片的累计布局偏移(CLS)问题 macOS 利用 Karabiner 修改 Emacs 键位为 Vim 键位 macOS 修改 Emacs 键位为 Vim 键位 Surge 配置 汉字的混乱 Netflix 中英双语字幕的好办法 优化 Rime 英文输入体验 判断字符是否为简体字或繁体字 Cloudflare 转入域名提示「出现了问题。请重试转移此域。尚未向您收费。」 图片压缩:Squoosh、TinyPNG、ImageOptim、WebP macOS grep + sed 批量替换多个文件的内容 在 macOS 根目录创建文件夹 博客图床小妙招 折腾 Hugo & PaperMod 主题 将博客部署在 Cloudflare Pages Alfred File Navigation(文件导航器)详解 在 Hugo Goldmark Markdown 中设置以新标签打开链接 日期与时间(UTC、GMT、时间戳、时区) 让 Alfred 以新标签的方式打开 Finder 用 git filter-branch 给 Git 仓库瘦身 qBittorrent 设置教程 联通光猫破解+桥接记录 配置 Mac 终端走代理 Steam for Mac 中文游戏推荐 我的 Mac 软件/工具列表 《Flask Web 开发》笔记 用 sleepwatcher 让 Mac 在睡眠及唤醒时自动执行一些脚本 解决 pyenv 导致的 brew warning 《SQL 必知必会》笔记 Git 自总结 Python 异步 IO 笔记 再见,双点医院! 用 CloudXNS 解决 CNAME 与 MX 记录冲突 你好,Hugo! 为 Mac 打造 zsh command line 环境 新 Mac 新装修 秦皇岛暑期自驾的烦恼 苹果公司开发者账号申请流程 UIScrollView 中使用 Masonry 解决 CocoaPods 的类库 import 没有提示 iOS 使用 CocoaPods 的快速回顾 GitBook 简单生成本地静态 HTML 的方法 你好, Hexo! About
利用 Cloudflare Workers 进行批量 301 重定向
Dvel · 2022-01-09 · via Dvel's Blog

在 Cloudflare 的「网站 - 规则 - 页面规则」中可以设置 URL 转发,免费默认可以使用 3 个规则,可以进行简单的通配符转换,如果这个能满足需求那最好了。

如下:将带 www 的网址 301 重定向到不带 www 的。

匹配 URL 转发 URL 重定向
www.dvel.me/* https://dvel.me/$1 301

但是很多时候需要更复杂的 URL 转发,比如个人博客瞎折腾,网站的后缀甚至域名来回改,无法仅仅通过通配符做到全部的 301 重定向,这时候还得用 Workers。

Update:批量重定向

今天打开 Cloudflare 一看,出了个「批量重定向 Beta」。。。

但是免费版限制了 5 个列表,每个列表 20 个,如果量小的话建议用用这个,量大的用 Workers。

创建一个 Worker

创建后选择「资源 - 快速编辑」,默认代码:

// 事件监听 fetch
addEventListener("fetch", event => {
  event.respondWith(handleRequest(event.request))
})

// 返回一个只包含"Hello world"的响应
async function handleRequest(request) {
  return new Response("Hello world")
}

点击「发送」即可测试:

Cloudflare Workers

301 一个 URL 试试

将上面代码改为:

addEventListener("fetch", event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  return Response.redirect("https://www.google.com", 301)
}

再点击「发送」进行测试:

Cloudflare Workers

再在「触发器 - 路由 - 添加路由」中添加一个 URL 进行测试 dvel.me/test

然后在浏览器中进行访问此网址,发现这个 URL 已经成功 301 到 Google 了。

大致的做法就是这样,批量重定向只需要将路由改为 dvel.me/*,再将需要跳转的新老 URL 在代码中处理即可。

官方示例

在上图点击右上角的「示例」,可以找到两个 Redirect 的示例

第一个示例将所有的请求重定向到一个 URL:

// Redirect all requests to one URL

const destinationURL = "https://example.com"
const statusCode = 301

async function handleRequest(request) {
  return Response.redirect(destinationURL, statusCode)
}

addEventListener("fetch", async event => {
  event.respondWith(handleRequest(event.request))
})

第二个示例是仅域名互换,保留后面的 path。即 foo.com/a?b=cbar.com/a?b=c

// Redirect requests from one domain to another

const base = "https://example.com"
const statusCode = 301

async function handleRequest(request) {
  const url = new URL(request.url)
  const { pathname, search } = url
  const destinationURL = base + pathname + search

  return Response.redirect(destinationURL, statusCode)
}

addEventListener("fetch", async event => {
  event.respondWith(handleRequest(event.request))
})

这两个完全没必要,因为用「页面规则」的「URL 转发」就可以完成了,除非你 3 个免费的规则都用完了。

手写更通用的转换

一个简单的示例:如果访问的地址和 old_url 撞上了,则返回 new_url

addEventListener("fetch", event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    let old_url = "https://dvel.xyz/posts/1234/"
    let new_url = "https://dvel.me/posts/ba-la-ba-la/"

    if (request.url === old_url) {
        return Response.redirect(new_url, 301)
    }
    
    return fetch(request)
}

完整版(同一个域名下跳转)

效果:只重定向当前域名下指定的路径。以后要是修改路径了就在这更新一下。

旧地址 新地址
dvel.me/posts/1234/ dvel.me/posts/ba-la-ba-la/

添加触发器的路由:dvel.me/*

addEventListener("fetch", event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    const arr = [
        "https://dvel.me/posts/1234/ https://dvel.me/posts/ba-la-ba-la/",
        // ...
    ]

    let old_url, new_url
    for (const u2 of arr) {
        [old_url, new_url] = u2.split(' ')
        if (request.url === old_url) {
            return Response.redirect(new_url, 301)
        }
    }

    return fetch(request)
}

Cloudflare Pages 的重定向

如果在用 Cloudflare Pages 的话,用 Pages 的重定向更简单。

在构件目录创建 _redirects 文件(也就是 Hugo 的 static 目录),参考 Redirects 文档创建规则,限制是 100 个。

完整版(域名 A 跳转域名 B)

效果:默认只转换域名,并保留后面的 path 和 search;后缀和域名都变了的,需要一个一个写进数组。

旧地址 新地址
dvel.xyz/posts/1234/ dvel.me/posts/ba-la-ba-la/

添加触发器的路由:dvel.xyz/*

addEventListener("fetch", event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    const arr = [
        "https://dvel.xyz/posts/1234/ https://dvel.me/posts/ba-la-ba-la/",
        // ...
    ]

    let old_url, new_url
    for (const u2 of arr) {
        [old_url, new_url] = u2.split(' ')
        if (request.url === old_url) {
            return Response.redirect(new_url, 301)
        }
    }

    const base = "https://dvel.me"
    const url = new URL(request.url)
    const { pathname, search } = url
    const destinationURL = base + pathname + search
    return Response.redirect(destinationURL, 301)
}