Cloudflare Workers:如果 URL 包含参数,则注入代码

Cloudflare Workers: Inject code if URL includes parameter

如果 URL 包含参数 ?beta,我将尝试使用 Cloudflare Workers 注入一些代码。

这是我试过的:

addEventListener("fetch", (event) => {
    event.respondWith(
        handleRequest(event.request).catch(
            (err) => new Response(err.stack, { status: 500 })
        )
    );
});

class ElementHandler {
    element(element) {
        element.append(`<style>.test {display:none}</style>`, { html: true });
    }
}

async function handleRequest(request) {

    const url = new URL(request.url)
    const res = await fetch(request)

    if (url.pathname.includes("?beta")) {
        return new HTMLRewriter().on("head", new ElementHandler()).transform(res)
    }
    else {
        return fetch(request)
    }
}

不幸的是,它不起作用...如果我将 ?beta 添加到 Worker 的 URL.

,代码不会添加到头部

我没有从控制台收到任何错误。谁能发现问题所在?

他这里的问题:

if (url.pathname.includes("?beta")) {

url.pathname只包含URL的路径部分。但是,? 及其后的所有内容均不被视为路径的一部分。相反,它是 url.search 的一部分。所以你可以这样做:

if (url.search.includes("?beta")) {

但是当有多个参数时,这可能会中断,比如 ?foo=bar&beta。相反,最好是使用 url.searchParams,它是所有参数的 key/value 映射:

if (url.searchParams.has("beta")) {