javascript - Cloudflare Workers 主 URL 重定向不起作用,参数也不起作用
问题描述
异地在这里。我正在尝试使用 Cloudflare Workers 将子域重定向到不同的域,但它不起作用:wa.example.com 到 wa.me/60123456789
及其运行良好的路径:wa.example.com/WantToBuy 到 wa.me/60123456789?text=Want%20To%20Buy
此外,我无法从同一脚本中的子域中删除参数(fbclid) 。
这个工人的路线是 wa.example.com/*
我如何使它工作?先感谢您。
这是我的完整脚本:
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})
async function fetchAndApply(request) {
let url = new URL(request.url);
let path = url.pathname;
var yourNumber = "60123456789"
const yourMessage = "'"+path+"'"
number = yourNumber
message = yourMessage.match(/(\d+|[a-z]+|([A-Z]([A-Z]+|[a-z]*)))/g).join('%20')
let whatsapp = 'wa.me/' + number + '?text=' + message
return fetch(whatsapp,request);
}
addEventListener('fetch', event => {
let url = new URL(event.request.url)
if (url.searchParams.has('fbclid'))
url.searchParams.delete('fbclid')
event.respondWith(
fetch(url, event.request)
)
})
解决方案
这里有几个问题...
number = yourNumber
message = yourMessage.match(/(\d+|[a-z]+|([A-Z]([A-Z]+|[a-z]*)))/g).join('%20')
你应该把var
or放在let
这些声明之前number
and message
。否则,您会将这些存储到全局变量中,这可能会影响其他请求,这几乎肯定不是您想要的。
message = yourMessage.match(/(\d+|[a-z]+|([A-Z]([A-Z]+|[a-z]*)))/g).join('%20')
当match()
没有找到任何匹配项时,它返回null
. 当你然后调用.join()
它时,这将引发异常。实际上,在预览中运行脚本会在控制台中生成以下错误消息:Uncaught (in response) TypeError: Cannot read property 'join' of null
这就是为什么您的脚本在没有发送路径时不起作用的原因——在这种情况下,正则表达式不匹配。
let whatsapp = 'wa.me/' + number + '?text=' + message
您可能希望添加https://
到此 URL 的开头,否则它无效。
addEventListener('fetch', event => {
您的脚本addEventListener('fetch')
不止一次使用,两个侦听器都会产生结果。调用的第一个侦听respondWith()
器将“获胜”,因此第二个侦听器被忽略,因此您发现它不起作用。
推荐阅读
- python - 如何制作 ctypes.Array?
- java - For循环从1计数到7
- java - 将数据从 JList 复制到(另一个)JList
- python - 通过一个 jupyter notebook (ipython) 文件运行多个数据集
- html - 使用 VBA/Excel 将 HTML 文件打印或转换为 PDF
- c - 我不能通过引用传递我的节点
- apache-spark - PySpark 警告消息
- firebase - Firebase 电子邮件链接身份验证选项在 Firebase 控制台上不可用
- microsoft-cognitive - Microsoft Academic Knowledge 的端点/API 密钥
- asp.net - 当从更新面板(ASP.NET Web 窗体)内部触发时,为什么不调用我的 jQuery 单击事件?