首页 > 解决方案 > 在位置重写,为反向代理的 proxy_pass

问题描述

我的 NGINX 反向代理上有一个 .conf 文件。我收到一个请求 URL,例如: http ://www.example.com/messaging

我需要让它将 /messaging 转换为 /system/console,转换为 karaf 容器。这似乎很简单,但事实并非如此,我会更好地解释为什么。

容器位于不同的子域中,例如 http://subdomain.local.example.com/system/console

我可以让它工作的唯一方法是不加载任何静态文件(图像、js、css),只有 html,就像这样:

location /messaging {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
rewrite /messaging/(.*) /$1 last;
proxy_pass http://subdomain.local.example.com/system/console/;
}

上面这种方式,图像是在http://subdomain.local.example.com/system/console/res/flags/en.gif 而不是messaging/system/console/res/flags/en.gif 请求的。

这是我的完整配置文件(不幸的是,这里的缩进不正确,我可以保证它在配置文件上是正确的):

upstream app-web-dev-lb {
server app-web-dev-01:8080;
server app-web-dev-02:8080;
}

server {
listen 80;
server_name app-dev.example.com;

client_max_body_size 50M;

location /my-services {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
proxy_pass http://app-cm-dev.local.example.com/my-services;
}

location /app-messaging {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';

#rewrite /app-messaging/(.*) /system/console/$1 break;
#rewrite /system/console/(.*) /app-messaging/$1 break;
#rewrite /app-messaging/(.*) /$1 last;
rewrite /app-messaging/(.*) /$1 break;
#rewrite /system/console/res/(.*) /app-messaging/res/$1 last;
#rewrite /app-messaging/res/(.*) /system/console/res/$1 last;
#rewrite /app-web(.*) /$1 last;

#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header Host $http_host;
#proxy_set_header Host $host;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#proxy_pass http://servicemix-dev.local.example.com/system/console;
#proxy_pass http://servicemix-dev.local.example.com/system/console/bundles;
proxy_pass http://servicemix-dev.local.example.com\;

#proxy_redirect /system/console /app-messaging/system/console;
#proxy_redirect default;
#proxy_redirect off;
#proxy_set_header Host $host;
}

location / {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
rewrite /app-web(.*) /$1 last;
proxy_pass http://app-web-dev-lb/app-web/;
}

location /app-web {
expires -1;
add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
rewrite /app-web(.*) /$1 last;
proxy_pass http://app-web-dev-lb/app-web/;
}
}

最后一点,我不想将 /messaging 重定向到 /,因为我有一个默认 / 地址,它已经重定向到其他路径。所以我不想添加 /system 位置,因为我会有更多的 Kafka 容器。我想了解为什么在 /messaging 位置内无法识别所有请求,为什么有些请求被重定向到 /system/console/.....

谁能帮我理解我做错了什么?非常感谢你的帮助!

最好的问候,路易斯·纳拜斯

标签: nginx

解决方案


您可以通过两种方式将 URI 从/messaging/footo重写/system/console/foo为上游。

方法一使用locationandproxy_pass指令进行翻译。例如:

location /messaging {
    expires -1;
    add_header ...;
    proxy_pass http://subdomain.local.example.com/system/console;
}

locationand语句上的 URI 都proxy_pass应该有尾随/,或者都不应该有尾随/。有关详细信息,请参阅此文档


方法二使用rewrite...break. 例如:

location /messaging {
    expires -1;
    add_header ...;
    rewrite /messaging(/.*)?$ /system/console$1 break;
    proxy_pass http://subdomain.local.example.com;
}

您必须使用 a break,因为重写的 URI 需要在同location一块内处理。有关详细信息,请参阅此文档


推荐阅读