许多分享链接带有诸如 UTM 参数、追踪器等其它不必要的查询参数。这些参数通常用于分析用户行为或其他营销目的,不恰当的分享方式还可能向被分享者泄露自己的账户信息。这个项目可以通过未经处理的分享链接反查到分享者的账户信息,这可能并不是我们期望的。

我们更希望分享一个干净的链接,不包含任何附加的跟踪信息。

Cloudflare Workers 是一种无服务器计算平台,允许开发者在全球边缘网络上创建和部署高度可扩展的 JavaScript 应用,使用 Cloudflare Workers 进行分享短链接展开能避免暴露本地 IP 地址给目标网站,提高用户匿名性。

这里介绍一个使用 Cloudflare Workers 移除跟踪参数的解决方案,通过处理 URL 来移除不必要的参数,同时特定处理某些需要保留参数的链接,如小红书的分享链接。这段代码可以应用于需要保护隐私、简化链接或其他需要干净 URL 的场合。

创建一个新的 Cloudflare Workers 应用,将下面的内容粘贴到 worker.js 中,通过 https://YOUR_WORKER_NAME.workers.dev/?link=YOUR_LINK 访问,即可自动跳转到去除了跟踪链接的页面中。

// 从传入的 URL 中提取 `?link=` 后面的内容
function getFullLink(url) {
    // 查找 `?link=` 的起始位置
    const startIndex = url.indexOf('?link=');
    if (startIndex === -1) {
        return null; // 如果没有找到 `?link=`,返回 null
    }
    // 返回 `?link=` 后面的内容
    return url.substring(startIndex + '?link='.length);
}

// 处理小红书链接,保留 `xsec_token` 参数
function processXiaohongshu(xhsUrlText) {
    const url = new URL(xhsUrlText);
    const xsecToken = url.searchParams.get('xsec_token'); // 获取 `xsec_token` 参数
    url.search = ''; // 清空查询参数
    if (!xsecToken) {
        // 如果没有 `xsec_token`,可能无法访问
        return url.toString();
    }
    // 返回带有 `xsec_token` 的 URL
    return url.toString() + "?xsec_token=" + xsecToken;
}

export default {
    async fetch(request, env, ctx) {
        const url = new URL(request.url);

        // 从查询参数中获取短链接
        const fullRequestText = getFullLink(request.url);

        if (!fullRequestText) {
            // 如果参数不正确,返回 400 Bad Request
            return new Response('Bad Request', {
                status: 400
            });
        }

        // 如果链接包含 `xiaohongshu`,直接处理小红书链接
        if (fullRequestText.includes('xiaohongshu')) {
            return Response.redirect(processXiaohongshu(fullRequestText), 302);
        }

        try {
            // 使用 HEAD 方法获取重定向信息
            const response = await fetch(fullRequestText, {
                method: 'HEAD',
                headers: {
                    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_7_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1' // 模拟 iPhone 的 User-Agent
                }
            });

            // 如果重定向后的 URL 包含 `xiaohongshu`,处理小红书链接
            if (response.url.includes('xiaohongshu')) {
                return Response.redirect(processXiaohongshu(response.url), 302);
            }

            const actualUrl = new URL(response.url); // 获取实际链接并创建 URL 对象
            actualUrl.search = ''; // 清空查询参数

            // 返回重定向响应
            return Response.redirect(actualUrl.toString(), 302);
        } catch (error) {
            // 如果发生错误,返回 500 Internal Server Error
            return new Response('Internal Server Error', {
                status: 500
            });
        }
    },
};