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")) {
如果 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")) {