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 устанавливает значение для имени домена источника, связанного с запрошенным объектом.
Добавление 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, есть активное перенаправление, которое вызывает это, и вы должны найти, где это настраивает и отменить его.