使用基于路径的位置块时如何处理 Web 应用程序的硬编码请求?

使用基于路径的位置块时如何处理 Web 应用程序的硬编码请求?

我正在尝试使用创建反向代理路由nginx-代理和 docker for打开旅行计划(OTP)版本 1.5.0 和 2.2.0 在同一台机器上。

如果我有一个简单的位置块,如:

location /otp2 {
        proxy_pass http://127.0.0.1:8081;
    }

OTP发出的大多数调用都会被传递到上游服务器,但是 OTP Web 应用程序也有一些硬编码调用http://host/otphttp://host/images不是 http://host/otp2/otphttp://host/otp2/images)。由于它们与 nginx 位置块不匹配,因此无法解析。

我如何确保这些调用也被路由到上游服务器?

我尝试过的方法

正则表达式 + 重写

经过一番折腾之后我决定:

location ~^/(otp2|otp|images) {          
        rewrite ^(/otp2)$ $1/ permanent;
        rewrite ^/(otp2)(.*) $2 break;
        rewrite ^/(otp)(.*) /$1$2 break;
        rewrite ^/(images)(.*) $1$2 break;                                                                                                                                                                           
        proxy_pass http://127.0.0.1:8081;
    }

这是可行的,但是这阻止我运行 OTP 版本 1.5.0,因为该二进制文件请求http://host/otphttp://host/images

此外,我在该主机上运行的每个具有路由的其他 Web 应用程序都/images可能会被该位置块接收。

子域名

我无法更改 DNS,所以(我认为)我只能执行基于路径的位置块,而不能执行像otp2.host.com和这样的子域otp1.host.com

单独的位置块

根据其中一位回答者的建议,我尝试了单独的位置块:

location /otp2 {
    proxy_pass http://127.0.0.1:8081/;
}

location /otp2/otp {
    proxy_pass http://127.0.0.1:8081/otp/;
}

location /otp2/images {
    proxy_pass http://127.0.0.1:8081/images/;
}

这部分可以工作,但留下了一些未处理的 OTP 请求,从而破坏了应用程序(表单的主机sub1.sub2.company.country在下面的屏幕截图中被混淆了):

答案1

让我们使用单独的位置块来处理来自 OTP 1.5.0 和 2.2.0 的特定硬编码请求,请尝试此配置:

server {
    listen 80;
    server_name your_host_name;

    # For OTP 1.5.0
    location /otp1 {
        proxy_pass http://127.0.0.1:8080;
    }

    location /otp1/otp {
        proxy_pass http://127.0.0.1:8080/otp;
    }

    location /otp1/images {
        proxy_pass http://127.0.0.1:8080/images;
    }

    # For OTP 2.2.0
    location /otp2 {
        proxy_pass http://127.0.0.1:8081;
    }

    location /otp2/otp {
        proxy_pass http://127.0.0.1:8081/otp;
    }

    location /otp2/images {
        proxy_pass http://127.0.0.1:8081/images;
    }

    # Additional web-apps with /images path
    location /other-web-app/images {
        proxy_pass http://127.0.0.1:8082/images;
    }

    # Handle remaining OTP v2 requests
    location /otp {
        proxy_pass http://127.0.0.1:8081/otp;
    }

    location /images {
        proxy_pass http://127.0.0.1:8081/images;
    }
}

相关内容