Lambda@Edge Перенаправление URL / перезапись пути с помощью NodeJS - PullRequest
0 голосов
/ 16 марта 2020

Я начал изучать NodeJS + Lambda@Edge несколько дней go, и одна из вещей, которые я пытался сделать, - это перенаправление / перезапись HTTP.

Моя текущая проблема - это когда я попробуйте использовать регулярные выражения на destination. Например, я хочу перенаправить https://example.com/pt-BR/blog-posts/.... на https://example.com/pt/blog/...., просто переписав начало pathname.

Возможно ли сделать это перенаправление? Я знаю, что мог бы сделать это с помощью NGINX, но мне было интересно, смогу ли я сделать то же самое с помощью Lambda@Edge и более «dynamici c», например, получить эти URL-адреса через DynamoDB.

const redirects = require('./redirects.json').map(
  ({ source, destination }) => ({
    source: new RegExp(source),
    destination
  })
);

exports.handler = async event => {
  const request = event.Records[0].cf.request;

  for (const { source, destination } of redirects) {
    if (source.test(request.uri)) {
      return {
        status: '301',
        statusDescription: 'Moved Permanently',
        headers: {
          location: [{ value: destination }]
        }
      };
    }
  }

  return request;
};

Это redirects.json. Первые два примера работают отлично, только последний - перенаправление на https://example.com/pt/blog/$1 вместо https://example.com/pt/blog/my-post-test001.

[
  {
    "source": "^/pt/pt",
    "destination": "/pt/"
  },
  {
    "source": "^/en/en",
    "destination": "/en/"
  },
  {
    "source": "^/pt-BR/blog-posts/(.*)",
    "destination": "/pt/blog/$1"
  }
]

Это примеры / документы, которые я проверил: https://nodejs.org/docs/latest/api/url.html#url_url https://aws.amazon.com/blogs/networking-and-content-delivery/leveraging-external-data-in-lambdaedge/ https://www.npmjs.com/package/express-urlrewrite

1 Ответ

0 голосов
/ 16 марта 2020

Да, можно переписать URI запроса просмотра Cloudfront. Правильный подход зависит от того, является ли цель перезаписи также объектом Cloudfront в источнике распространения. Если это так, просто измените URI на предполагаемую цель.

  1. Не возвращать 301.
  2. Измените request.uri с помощью пути перезаписи uri.
  3. Добавить параметры контекста и обратного вызова в функцию (событие, контекст, обратный вызов)
  4. вернуть объект запроса с обратным вызовом (null, request);

Здесь это пример функции, которая изменяет URI cfrequest. Обратный вызов возвращает тот же самый cfrequest другому URI.

Пример с NodeJS: переписать uri '/ posts /' в '/posts/index.html'

const DEFAULT_OBJECT = 'index.html';
exports.handler = (event, context, callback) => {
  const cfrequest = event.Records[0].cf.request;
  if (cfrequest.uri.length > 0 && cfrequest.uri.charAt(cfrequest.uri.length - 1) === '/') {
    // e.g. /posts/ to /posts/index.html
    cfrequest.uri += DEFAULT_OBJECT;
  }
  callback(null, cfrequest);
  return true;
};     

Обязательно настройте запрос средства просмотра поведения Cloudfront с помощью функция перезаписи Lambda@Edge. Это отличается от лямбда-функции исходного запроса.

Ссылка: Ху go Быстрый старт, размещенный на Cloudfront с lambda@edge

Это будет одна счастливая лямбда функция!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...