Описание сценария:
У компании есть сервер Tencent Cloud и сервер Alibaba Cloud.Доменное имя зарегистрировано в Alibaba Cloud.Tencent Cloud не может его открыть, поэтому оно напрямую заблокировано.
Учитывая, что стоимость миграции немного высока, я не хочу переносить код, поэтому мне нужно указать доменное имя на сервер Alibaba Cloud и использовать обратный прокси-сервер на сервер Tencent Cloud.
域名 => 阿里云服务器(服务器A) => 腾讯云服务器(服务器B)
www.example.com => 192.168.0.1 => 192.168.0.2
исходная конфигурация
Сервер А 192.168.0.1
server {
listen 80;
server_name www.example.com;
# 转发到服务器B
location / {
proxy_pass http://192.168.0.2:8000/;
proxy_redirect off;
proxy_set_header X-NginX-Proxy true;
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;
}
}
Сервер Б 192.168.0.2
server {
listen 8000;
server_name localhost;
index index.html index.htm index.php;
# 管理后台
location ^~ /admin {
alias "/data/wwwroot/www.example.com";
try_files $uri $uri/ /admin/index.html;
}
}
Возникла ситуация 1:
В начале я обнаружил, что доменное имя доступа: https://www.example.com/admin автоматически перенаправляется на: http://192.168.0.1:8000/admin
Если вы обращаетесь к доменному имени: https://www.example.com/admin/, перехода нет
В это время можно нормально открыть
Решение:
добавить параметры
proxy_set_header Host $host;
Возникла ситуация 2:
В начале я нашел доменное имя: https://www.example.com/admin и автоматически перенаправил на: http://www.example.com:8000/admin
Если вы обращаетесь к доменному имени: https://www.example.com/admin/, перехода нет
Обнаружил, что заголовок ответа выглядит так
GET https://www.example.com/admin
location: https://www.example.com:8000/admin/
решение
proxy_redirect http://$host:8000/ /;
Роль proxy_redirect
proxy_redirect Эта команда используется для изменения полей заголовка Location и поля заголовка Refresh в заголовке ответа, возвращаемом прокси-сервером.
Окончательный вариант
Сервер А
server {
listen 80;
server_name www.example.com;
# 转发到服务器B
location / {
proxy_pass http://192.168.0.1:8000/;
proxy_redirect http://$host:8000/ /;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
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;
}
}
ссылка