Управление 302 перенаправлениями из-за обратного прокси - PullRequest
0 голосов
/ 28 августа 2018

Предположим, у меня есть docker-compose установка с тремя службами:

  • foo-app с конечной точкой /foo, которая просто возвращает строку "foo"
  • bar-app с конечной точкой /bar, которая перенаправляет на конечную точку foo-app / foo
  • обратный прокси-сервер (nginx, httpd или аналогичный), прослушивающий хост, который отображает следующее:
    • /foo до http://foo-app/foo
    • /bar до http://bar-app/bar

Если перейти к http://localhost/foo, я получу ответ HTTP 200 «foo», сгенерированный вышестоящей foo-app службой. Это работает как ожидалось.

Если я перейду к http://localhost/bar, я получу ответ HTTP 302 с местоположением http://bar-app/bar. Мой браузер затем пытается перенаправить на этот URL, но, очевидно, он не может достичь его, так как он находится внутри сети докера. Мне нужно переписать это как http://localhost/bar.

У меня такой вопрос: как мне управлять перезаписью URL-адресов, которые перенаправляют с одного вышестоящего сервиса на другой? Это то, чем я должен управлять в своем веб-приложении? Или я должен справиться с этим на обратном прокси?

Я бы предпочел управлять этим на обратном прокси-сервере, если это возможно. Я не думаю, что мои веб-приложения должны знать, что они находятся за обратным прокси.

докер-compose.yml

version: '3'
services:
  test-app-1:
    image: revproxy/test-app-1:1.0-SNAPSHOT
    ports:
    - "7401:8080"
    - "7321:8000"
  test-app-2:
    image: revproxy/test-app-2:1.0-SNAPSHOT
    ports:
    - "7402:8080"
    - "7322:8000"
  nginx:
    image: revproxy/nginx:1.0-SNAPSHOT
    ports:
    - '7400:80'

nginx.conf

worker_processes 1;

events { worker_connections 1024; }


http {

    log_format compression '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $upstream_addr '
        '"$http_referer" "$http_user_agent" "$gzip_ratio"';

    server {
        listen 80;
        access_log /var/log/nginx/access.log compression;

        location /app1/ {
            proxy_pass         http://test-app-1:8080;
            proxy_set_header   Accept-Encoding "";
            proxy_set_header   Host $host:7400;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect     / /;
        }

        location /app2/ {
            proxy_pass         http://test-app-2:8080;
            proxy_set_header   Accept-Encoding "";
            proxy_set_header   Host $host:7400;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect     / /;
        }

    }
}

Веб-приложения настроены на контекстные корни /app1 и /app2 соответственно.

...