我正在嘗試在 cloudflare 作業人員中進行批量重定向。to這是一個帶有和url的物件陣列from,有些是跨域的。
const redirects = [
{
"from": "https://some.domain.tld/product/*",
"to": "https://another.domain.tld/product/*"
},
]
我想尊重通配符并嘗試根據 url 的路徑名進行重定向。
這是我的嘗試,但這僅適用于固定路徑名而不是跨域。在工人操場編輯器中測驗跨域有點困難。
async function handleRequest(request) {
const url = new URL(request.url)
const host = url.hostname;
const path = url.pathname;
const queryStrings = url.search;
const location = redirects.find(r => {
return r.from.includes(path);
});
if (location) {
return Response.redirect('https://' host location.to queryStrings, 301)
}
return fetch(request)
}
addEventListener("fetch", async event => {
event.respondWith(handleRequest(event.request))
})
如何更改此代碼以使其尊重帶有通配符的重定向?通配符很可能總是在末尾,一些路徑名沒有通配符,而且它并不總是/product在重定向物件中的任何路徑名。
回答后更新:
const redirects = [
{
"from": "https://red.domain.com/product-1/*",
"to": "https://blue.domain.com/product-1/*"
},
]
async function handleRequest(request) {
const url = 'https://red.domain.com/product-1/fees';
const location = redirects.reduce((loc, r) => {
let match = url.split(r.from.replace("*", "")[1]);
if (match) return r.to.replace("*", "") match;
}, "");
if (location) {
return Response.redirect(location, 301)
}
return fetch(request)
}
addEventListener("fetch", async event => {
event.respondWith(handleRequest(event.request))
})
結果:
https://blue.domain.com/product-1/h,,ps://red.domain.com/produc,-1/fees
uj5u.com熱心網友回復:
您可以使用 將整個 URL 與您的重定向匹配Array#split(),同時獲取通配符“之后”的部分:
console.log(
"https://some.domain.tld/product/foo/bar/baz?test=baf".split("https://some.domain.tld/product/")[1]
)
對于與此重定向不匹配的 URL,結果將為undefined,因此:
const redirects = [
{
"from": "https://some.domain.tld/product/*",
"to": "https://another.domain.tld/product/*"
},
]
async function handleRequest(request) {
const {url} = request;
const location = redirects.reduce((loc, r) => {
let match = url.split(r.from.replace("*","")[1]; // remove wildcard * for matching
if(match) return r.to.replace("*","") match;
},"")
if (location) {
return Response.redirect(location, 301)
}
return fetch(request)
}
addEventListener("fetch", async event => {
event.respondWith(handleRequest(event.request))
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418273.html
標籤:
