来自代理主机的回复标题302代码中的热更改“位置”。

时间:2018-04-25 14:47:20

标签: nginx kubernetes

我有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也不起作用,因为此参数仅适用于请求标头。

1 个答案:

答案 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次编辑:

  1. 如果你要使用非标准端口 - 你需要写" proxy_set_header主机$ http_host;"在位置部分;
  2. 属性中的网址可以像" http://security-rest-api:9999/"并喜欢" http%3A%2F%2Fsecurity-rest-api%3A9999%2F"。您需要为每种类型的属性使用这两个条件。
  3. 我使用此修改更正了代码