Tengo una función lambda que realiza una redirección 301 si tiene uri que se genera usando expresiones regulares.
const redirects = { xyz: '/contact', abc: '/about', }; const arrRegex = [ { regex: /\xyz/\faq/\max, redirect: redirects.xyz }, { regex: /\abc/\faq/\min, redirect: redirects.abc }, { regex: /\lmn\?page=[1-9]/, redirectNotNeeded } ]; function redirect(request) { let requests = request.uri; let finalUrl = ''; arrRegex.some(reg => { const re = new RegExp(reg.regex); if (requests.match(re) && reg.redirectNotNeeded) { finalUrl = request; return true; } else if (requests.match(re) && reg.redirect) { finalUrl = reg.redirect; return true; } else { return requests.match(re) && !reg.redirect; } }); return finalUrl; } exports.handler = (event, context, callback) => { // find request URL const request = event.Records[0].cf.request; request.uri = redirect(request); let prefixPath; // needed for 2nd condition if (request.uri.match('.+/$')) { request.uri += 'index.html'; callback(null, request); } else if (prefixPath = request.uri.match('(.+)/index.html')) { const response = { status: '301', statusDescription: 'Found', headers: { location: [{ key: 'Location', value: prefixPath[1] + '/', }], } }; callback(null, response); } else if (request.uri.match('/[^/.]+$')) { const response = { status: '301', statusDescription: 'Found', headers: { location: [{ key: 'Location', value: request.uri + '/', }], } }; callback(null, response); } else { callback(null, request); } }; Al implementar la función y agregarla a los comportamientos de la nube, cuando voy a la URL https:my-website/xyz/faq/max , aunque veo el estado 301 para https:my-website/xyz/faq/max después de redirigir correctamente a https:my-website/contact , muestra el error 502. También muestra el mismo error para https:my-website . En el cromo debajo del estado, veo LambdaValidationError from cloudfront debajo del encabezado de respuesta. ¿Puedo saber qué estoy haciendo mal aquí para arrojar este error? Las páginas son solo páginas estáticas almacenadas en un depósito de AWS S3 servido con Amazon CloudFront.
Cambiando let finalUrl = ''; let finalUrl = request.uri; me ayudó a deshacerme del error ya que lo estaba configurando en una cadena vacía, la lambda arrojaba un error 502 ya que no podía redirigir el tráfico cuando no había uri en la solicitud.
const redirects = { xyz: '/contact', abc: '/about', }; const arrRegex = [ { regex: /\xyz/\faq/\max, redirect: redirects.xyz }, { regex: /\abc/\faq/\min, redirect: redirects.abc }, { regex: /\lmn\?page=[1-9]/, redirectNotNeeded } ]; function redirect(request) { let requests = request.uri; let finalUrl = request.uri; arrRegex.some(reg => { const re = new RegExp(reg.regex); if (requests.match(re) && reg.redirectNotNeeded) { finalUrl = request; return true; } else if (requests.match(re) && reg.redirect) { finalUrl = reg.redirect; return true; } else { return requests.match(re) && !reg.redirect; } }); return finalUrl; } exports.handler = (event, context, callback) => { // find request URL const request = event.Records[0].cf.request; request.uri = redirect(request); let prefixPath; // needed for 2nd condition if (request.uri.match('.+/$')) { request.uri += 'index.html'; callback(null, request); } else if (prefixPath = request.uri.match('(.+)/index.html')) { const response = { status: '301', statusDescription: 'Found', headers: { location: [{ key: 'Location', value: prefixPath[1] + '/', }], } }; callback(null, response); } else if (request.uri.match('/[^/.]+$')) { const response = { status: '301', statusDescription: 'Found', headers: { location: [{ key: 'Location', value: request.uri + '/', }], } }; callback(null, response); } else { callback(null, request); } };