CNAME to CloudFront: чтение фактического URL-адреса браузера на стороне сервера

Я пытаюсь прочитать фактический URL-адрес браузера на стороне сервера (Node.js), но получаю URL-адрес экземпляра EC2.

У меня есть установка, состоящая из приложения Node.js, работающего на EC2 с дистрибутивом Cloudfront.

Мой домен, example.com указывает на распределение Cloudfront:

Тип: запись CNAME
Host: stg (указывает на промежуточный сервер на поддомене)
Значение: xxxxxxxxxxxxxxxx.cloudfront.net

Все отлично работает, только одна маленькая загвоздка. Мое приложение должно прочитать фактический URL в браузере, но все в объекте запроса указывает на экземпляр EC2 ec2-xx-xx-xxx-xxx.ap-southeast-2.compute.amazonaws.com.

Например console.log(req.host) // c2-xx-xx-xxx-xxx.ap-southeast-2.compute.amazonaws.com

Это моя установка Nginx:

upstream node {
  server 127.0.0.1:3000;
  keepalive 64;
}

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name example.com *.example.com;

  location / {
    proxy_pass $scheme://node$request_uri;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Proto-Version $http2;
    proxy_set_header X-Forwarded-Host $host:$server_port;
    proxy_set_header Host $http_host;
    proxy_set_header domain https://stg.example.com; # Temp fix
  }
}

Я жестко закодировал заголовок в Nginx proxy_set_header domain https://stg.example.com; что я могу прочитать на уровне приложения, однако это не совсем верно.

Есть ли способ лучше?

2 ответа

Добавить Host заголовок в белый список заголовков для пересылки на исходный сервер в настройках поведения кэша CloudFront.

По умолчанию CloudFront переписывает этот заголовок.

Host

Поведение, если вы не настраиваете CloudFront для кэширования на основе значений заголовка... CloudFront устанавливает значение для имени домена источника, связанного с запрошенным объектом.

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html

Добавление Host в белый список должен исправить вашу проблему.

Но это также создаст новые проблемы в зависимости от того, как вы настроили свое происхождение и как / используете ли вы SSL на бэкэнде. Если к источнику обращаются через SSL, то dzzzexample.cloudfront.net не может использоваться для доступа к вашему дистрибутиву из адресной строки браузера, если только внутренний сертификат не соответствует настроенному исходному доменному имени. Существует причина для такого изменения поведения, и это правильное поведение со стороны CloudFront, но, возможно, выходит за рамки этого вопроса. См. HTTP 502 Код состояния Bad Gateway в Руководстве разработчика CloudFront для подробного объяснения этого условия.

Если вы получаете доступ http://stg.example.com/ или же https://stg.example.com/Ваш браузер должен отображать именно этот адрес. Вам не нужно ничего делать, чтобы это произошло.

Если ваш браузер меняет адрес на c2-xx-xx-xxx-xxx.ap-southeast-2.compute.amazonaws.com, есть активное перенаправление, которое вызывает это, и вы должны найти, где это настраивает и отменить его.

Другие вопросы по тегам