从反向代理后面管理302重定向

时间:2018-08-28 16:20:04

标签: nginx url-rewriting reverse-proxy

假设我有一个docker-compose设置,其中包含三个服务:

  • foo-app,其端点/foo仅返回字符串“ foo”
  • bar-app,其端点/bar重定向到foo-app的/ foo端点
  • 在主机上侦听的反向代理(nginx,httpd或类似文件),其映射以下内容:
    • /foohttp://foo-app/foo
    • /barhttp://bar-app/bar

如果我转到http://localhost/foo,则收到的响应是上游foo-app服务生成的HTTP 200“ foo”。这可以按预期工作。

如果我转到http://localhost/bar,则收到的响应是HTTP 302,位置为http://bar-app/bar。然后,我的浏览器尝试重定向到该URL,但是显然它无法访问,因为它在docker网络内部。我需要将其改写为http://localhost/bar

我的问题是:如何管理从一个上游服务重定向到另一上游服务的URL重写?这是我应该在我的Web应用程序中管理的东西吗?还是应该在反向代理处处理?

如果可能的话,我希望在反向代理服务器上进行管理。我认为我的Web应用程序不必知道它们背后是反向代理。

docker-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     / /;
        }

    }
}

Web应用程序被配置为分别具有/app1/app2的上下文根。

0 个答案:

没有答案