nginx - 在位置重写,为反向代理的 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/.....
谁能帮我理解我做错了什么?非常感谢你的帮助!
最好的问候,路易斯·纳拜斯
解决方案
您可以通过两种方式将 URI 从/messaging/foo
to重写/system/console/foo
为上游。
方法一使用location
andproxy_pass
指令进行翻译。例如:
location /messaging {
expires -1;
add_header ...;
proxy_pass http://subdomain.local.example.com/system/console;
}
location
and语句上的 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
一块内处理。有关详细信息,请参阅此文档。
推荐阅读
- uicollectionview - Titanium TiCollectionView 未在设备上编译
- python - Python Tkinter:如何获取字体信息
- c++ - 使用 Arduino IDE 的构造函数的未定义参考错误
- html - CSS Grid如何选择行以添加悬停效果?
- excel - 插入列后更改命名范围引用
- c++ - Direct X 11:在屏幕上绘制一个简单的彩色矩形
- python - 如何将标签添加到显示熊猫中的 value_counts 的两个重叠条形图
- python - 在python中将json字符串转换为单个字典
- python - 如何访问实例变量?
- visual-studio-code - 如何以编程方式将文件打开到 VS Code Split 窗口