Nginx делает перенаправление, а не прокси

Я хочу настроить Nginx как обратный прокси для службы https, потому что у нас есть специальный usecase, где нам нужно "un-https" соединение:

http://nginx_server:8080/myserver ==> https://mysecureservice

Но происходит то, что фактический сервис https не проксирован. Nginx перенаправляет меня на фактический сервис, поэтому URL-адрес в браузере изменяется. Я хочу взаимодействовать с Nginx, поскольку это был фактический сервис, без https.

Это то, что у меня есть:

server {
    listen 0.0.0.0:8080 default_server;
    location /myserver {
        proxy_pass https://myserver/;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
    }
}

Ответ 1

Вы должны использовать proxy_redirect для обработки перенаправления.

 Sets the text that should be changed in the "Location" and "Refresh" header fields of a 
 proxied server response. Suppose a proxied server returned the header field 
 "Location:https://myserver/uri/". The directive
 will rewrite this string to "Location: http://nginx_server:8080/uri/". 

Пример:

 proxy_redirect https://myserver/ http://nginx_server:8080/;

Источник: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Ответ 2

Вы можете настроить nginx следующим образом, если вы не хотите, чтобы сервер делал перенаправления:

server
{
    listen 80;
    server_name YOUR.OWN.DOMAIN.URL;
    location / {
        proxy_pass http://THE.SITE.URL.YOU.WANT.TO.DELEGAGE/;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Ответ 3

Для меня этого конфига было достаточно:

events {
}

http {
    server {
        location / {
            resolver 8.8.8.8;
            proxy_pass https://www.example.com$request_uri;
        }
    }
}

(обратите внимание, что директива resolver не имеет ничего общего с проблемой в OP, мне просто нужно было иметь возможность проксировать внешний домен, такой как example.com)

Проблема для меня заключалась в том, что мне не хватало www. в www.example.com. В консоли разработчика Firefox я мог видеть, что запрос GET к localhost возвращается с 301, и поэтому я подумал, что NGINX выдает 301 вместо того, чтобы просто отражать example.com. Не так: на самом деле проблема была в том, что example.com возвращал 301 для перенаправления на www.example.com, NGINX должным образом отражал эти 301, а затем Firefox "изменил URL" (после перенаправления) прямо с localhost на www.example.com.