Назад | Перейти на главную страницу

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

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

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

Мой домен example.com указывает на раздачу Cloudfront:

Тип: запись CNAME
Хост: 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; который я могу прочитать на уровне приложения, но это не совсем верно.

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

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

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

Host

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

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior

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

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

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

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