Перенаправление Nginx обратного прокси

13

Я использую nginxв качестве обратного прокси-сервера, и когда я вхожу в свой веб-интерфейс, я перенаправлен на прокси-URL. Я хотел бы избежать этого и всегда сохранять «имя_сервера» в качестве URL. Является ли это возможным?

Это мое /etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

Я подключаюсь http://my-app.net, ввожу данные для входа, затем я перенаправляюсь http://ip_of_the_app:7180на ту же страницу входа в систему, и мне необходимо снова войти в систему. Можно ли избежать двойного входа?

tonio94
источник
tonio94, ваша проблема решена? если да, пожалуйста, примите ответ. Если нет, пожалуйста, уточните, чего не хватает.
CNST
2
Я только что проверил вчера, он работает, proxy_redirect нужно удалить. Спасибо за помощь.
tonio94

Ответы:

25

Не назначайте proxy_redirectна off, что не делает то , что вы думаете , он делает. proxy_redirectвыполняет что-то похожее на перезапись URL, например:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

Это позволяет вам разместить /sales/путь в другом месте. Но даже в этом случае параметры по умолчанию proxy_redirectделают именно это для вас бесплатно. По умолчанию перенаправляется местоположение во все, что присутствует proxy_pass(и параметры по умолчанию используются, когда вы вообще не устанавливаете proxy_redirectили не используете proxy_redirect default;).

Вам не нужно устанавливать proxy_redirect.


Вам не хватает заголовков, которые нужно отправить в приложение. Самый важный из них HOST. Это выполнит проксирование по желанию и сохранит правильный URL в браузере.

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

Обратите внимание, что приложение http://ip_of_the_app:7180/теперь получит запрос с Host: my-app.netзаголовком.


Вам также следует рассмотреть возможность использования еще нескольких заголовков:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Это позволит улучшить ведение журнала в приложении по адресу http://ip_of_the_app:7180/. X-Forwarded-Forуказание IP-адреса фактического клиента (в отличие от nginxs-IP) и X-Forwarded-Protoпроверка, подключен ли клиент nginxчерез HTTP или HTTPS.

grochmal
источник
Спасибо за вашу помощь. proxy_redirect не требуется, но proxy_set_header Referer ip_of_the_app: 7180 должен быть установлен для правильной работы.
tonio94
@ tonio94 - Спасибо, я обновил ответ. Обратите внимание, что обычное использование Refererпросто $http_refererкопирует его из запроса. Это не работает, если запрос не имеет заголовка Referer, поэтому в некоторых случаях его жесткое кодирование является решением.
Грохмал
@JonathanKomar - Спасибо за это, вы правы, теперь отредактированы. Извините, мне потребовалось время, чтобы заметить ваш комментарий.
Горький