NGINX в качестве обратного прокси - переадресация не работает - PullRequest
0 голосов
/ 06 марта 2019

У меня есть следующее:

  • HTTPS-доступ к NAS или что-то в этом роде.
  • NGINX в качестве резервного прокси в качестве контейнера
  • Контейнер с Tomcat в качестве appcontainer.

NAS пересылает HTTPS-запрос как HTTP в контейнер NGINX. Затем контейнер NGINX перенаправляет HTTP-запрос в мой appcontainer.

Я могу получить доступ к странице входа в мой appcontainer, но после входа в систему выполняется POST следующим образом Nginx access.log

POST /foo/login.do HTTP/1.1" 302 0 "https://nas.dns.server/foo/login.do

В localhost_access.log в appcontainer tomcat показывает

POST /foo/doLogin.do HTTP/1.0" 302

и запрос как HTTP к NAS

Кажется, что игнорируется заголовок X-Forwarded-Proto.

Мой nginx.conf настроен следующим образом:

server {
    listen 80;

    server_name $hostname;
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;
    error_log   /dev/stdout info;
    access_log  /dev/stdout;

    client_max_body_size 100M;

    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    send_timeout 300;

    resolver 127.0.0.11 valid=30s;

    sendfile on;

    location /foo {
        proxy_set_header Origin "";
        set $appcontainer          http://appcontainer:8080;
        proxy_pass         $appcontainer;
        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   $https;  #I’ve also tested with $scheme
    } 
}

Спасибо

1 Ответ

0 голосов
/ 07 марта 2019

Взглянув на инструмент разработчика Chrome на вкладке Сеть, можно увидеть, что для вызова login.do есть Request URL: https://entry.proxy.url/foo/doLogin.do, но в Response Headers я вижу, что вызывает проблему Location: http://proxy.entry.url/foo/login.do, которая должно быть Location: https://proxy.entry.url/foo/login.do.

Я пытался сделать перенаправление как proxy_redirect http://entry.proxy.url/ https://csprocure.ciport.be/; в местоположении, и это работает.

Таким образом, местоположение устанавливается как:

location /foo {
    proxy_set_header Origin "";
    set $appcontainer          http://appcontainer:8080;
    proxy_redirect     http://proxy.entry.url/ https://proxy.entry.url/;
    proxy_pass         $appcontainer;
    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   $https;  #I’ve also tested with $scheme
} 
...