Зворотне перенаправлення проксі-сервера Nginx


14

Я використовую nginxяк зворотний проксі, і коли я входжу у свій веб-інтерфейс, я переспрямовуюсь на проксі-адресу. Я хотів би цього уникати і завжди зберігати "ім'я_сервера" як 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, чи вирішено вашу проблему? якщо так, будь ласка, прийміть відповідь. якщо ні, то уточнюйте, чого немає.
cnst

2
Я щойно тестував його вчора, він працює, проксі_redirect потрібно видалити. Дякую за допомогу.
tonio94

Відповіді:


27

Не призначайте 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.


Спасибі за вашу допомогу. proxy_redirect не потрібен, але для належної роботи слід встановити proxy_set_header Referer ip_of_the_app: 7180 .
tonio94

@ tonio94 - Дякую, я оновив відповідь. Зауважте, що звичайне використання пристрою Refererпросто $http_refererкопіює його з запиту. Це не працює, якщо запит не має заголовка Referer, тому жорстке кодування - це рішення у деяких випадках.
grochmal

@JonathanKomar - Дякую за це, ви маєте рацію, зараз відредаговані. Вибачте, мені знадобилося деякий час, щоб помітити ваш коментар.
grochmal

@grochmal Спасибі, ви в основному врятували мені життя з цією інформацією про: proxy_set_header HOST $ host;
Обай Абд-Алгадер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.