Nginx: proxy_pass и try_files 301 прыгают с портом

Описание сценария:

У компании есть сервер 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;
 }
}

ссылка

Guess you like

Origin blog.csdn.net/mouday/article/details/130623309