将位置重写为反向代理的proxy_pass

时间:2019-02-13 16:01:46

标签: nginx

我的NGINX反向代理上有一个.conf文件。 我收到如下请求网址: 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处被请求 而不是消息传递/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 /.....

有人可以帮助我了解我在做什么错吗? 非常感谢您的帮助!

最好的问候, 路易斯·纳拜斯(Luis Nabais)

1 个答案:

答案 0 :(得分:0)

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

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

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

locationproxy_pass语句上的URI应该都带有尾随/,或者都不应该带有尾随/。有关详细信息,请参见this document


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

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

您必须使用break,因为重写的URI需要在​​同一location块中进行处理。有关详细信息,请参见this document