Estoy tratando de hacer que la redirección por lotes funcione en los trabajadores de Cloudflare. Aquí hay una serie from to y destino, algunos serán dominios cruzados.
const redirects = [ { "from": "https://some.domain.tld/product/*", "to": "https://another.domain.tld/product/*" }, ]Me gustaría respetar los comodines e intentar redirigir según el nombre de ruta de la URL.
aquí está mi intento, pero esto es solo para rutas fijas y no para dominios cruzados. Es un poco difícil probar el dominio cruzado en el editor de juegos de trabajadores.
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)) }) ¿Cómo puedo cambiar este código para que respete las redirecciones con comodines? Lo más probable es que los comodines siempre estén al final, algunos nombres de ruta no tendrán comodines y no siempre será /product sino cualquier nombre de ruta que esté en el objeto de redirección.
Actualizado después de la respuesta:
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)) })resultado:
https://blue.domain.com/product-1/h,,ps://red.domain.com/produc,-1/fees
Puede hacer coincidir la URL completa con sus redireccionamientos usando Array#split() , mientras recupera la parte "después" del comodín:
console.log( "https://some.domain.tld/product/foo/bar/baz?test=baf".split("https://some.domain.tld/product/")[1] ) Para las URL que no coincidan con esta redirección, el resultado será undefined , por lo que:
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)) })