我有kubernetes-cluster和一些带有web-app的pod /容器。 Pod通过pod的名称与listen端口9999相连(如security-rest-api:9999,common-rest-api:9999等)。 到外面听外部地址http://e.net:30200/的nginx-pod。
((APP-荚:9999) - (nginx的-POD:80) - (nginx的服务:30200)) - 网络
Nginx使用以下配置与app-pod交互。
server {
listen 80;
server_name e.net;
location / {
proxy_pass http://web-console:9999/;
proxy_redirect http://web-console:9999/ http://e.net:30200/;
}
location /common {
proxy_pass http://common-rest-api:9999/common;
proxy_redirect http://common-rest-api:9999/ http://e.net:30200/;
}
location /security {
proxy_pass http://security-rest-api:9999/security;
proxy_redirect http://security-rest-api:9999/ http://e.net:30200/;
} }
它工作得非常好,但我有一个问题来自app-pods的302回复:
如果我尝试登录我的应用程序,我会按照302回复标题:
HTTP/1.1 302 Found
Connection: keep-alive
Content-Length: 0
Date: Wed, 25 Apr 2018 10:37:50 GMT
Location: http://e.net:30200/security/rest/auth/login.html?callbackUrl=http://security-rest-api:9999/security/rest/namespace
Server: nginx/1.13.9
App-pods从Host请求标头生成URL参数“callbackUrl”内部容器网络和此URL参数到达端点浏览器。当然,下一个请求获得404代码。
我无法编辑应用程序代码(在app-pods中不使用nginx),但我想在位置中将'security-rest-api:9999'更改为'e.net:30200'参数302回复标题。我怎么能这样做?
重定向不合适,因为这会产生新的302回复并且无法解决我的问题。 sub_filter仅更改回复正文,但不更改回复头(其中是Location参数)。 request_uri也不起作用,因为此参数仅适用于请求标头。
答案 0 :(得分:0)
不,它没有用。
我测试了这种情况并找到了工作的配置:
if ($args ~* (.*)(callbackUrl=http://security-rest-api:9999/)(.*)) {
set $args $1callbackUrl=http://e.net:30200/$3;
rewrite ^(.*)$ $1;
}
if ($args ~* (.*)(callbackURL=http%3A%2F%2Fsecurity-rest-api%3A9999%2F)(.*)) {
set $args $1callbackURL=http%3A%2F%2Fe.net%3A30200%2F$3;
rewrite ^(.*)$ $1;
}
location /security {
proxy_pass http://security-rest-api:9999/security;
proxy_set_header Host $http_host;
proxy_redirect http://security-rest-api:9999/ http://e.net:30200/;
}
稍后,我将尝试在预生产台上使用此配置,如果这项工作(或更正后的工作) - 我会在这里写。
感谢您提供帮助信息: https://blog.imaginea.com/modifying-query-parameters-nginx-in-reverse-proxy-mode/
也谢谢大家!
修改强>
我测试了这个配置并进行了2次编辑:
我使用此修改更正了代码