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