Nginx标头的sub_filter

我想在运行于各自端口上的不同应用程序之前使用nginx proxy_pass。

所以我有

server {

    listen 443 ssl;
    ssl on;

    ssl_certificate /etc/ssl/certs/self-signed.crt;
    ssl_certificate_key /etc/ssl/private/self-signed.key;

    proxy_intercept_errors on;

    location /app1/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_redirect off;
        proxy_pass http://localhost:1111;
    }

    location /app2/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_redirect off;
        proxy_pass http://localhost:2222;
    }
}

但是问题是应用程序本身具有重定向,从而导致/ app1 /或/ app2 /消失。

即302 get / page1将变成https://example.com/page1而不是https://example.com/app1/page1

因此,基本上,只要有人在/ app1 / *页面上始终以/ app1 /为前缀即可。

如果这实际上是完整域名,如果不发生这种情况,那将非常好,这样就可以从/ app1 /页面中的/ app2 /网址加载资源

是否可以通过Nginx config进行修复?还是只能在应用程序本身中进行修复?

编辑:

我发现Nginx有一个名为sub_filter的函数。

这替换了响应正文中的字符串。

所以: 应用程序返回:200个“ hello world!”

//nginx
sub_filter "world" "moon";

然后浏览器将显示“你好月亮!”

但是我还需要对302个重定向执行此操作。

标题是否有“ sub_filter等效项”?

EDIT2:

正如伊万(Ivan)所建议的那样,代理重定向应该可以解决问题,但是它并没有改变任何东西。 我的Nginx代码是:

location /app1/ {
    proxy_set_header accept-Encoding ""; # no compression allowed or next won't work
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_buffering off;
    proxy_read_timeout 3600;
    proxy_connect_timeout 3600;
    fastcgi_read_timeout 3600s;

    proxy_pass http://localhost:5000/;
    proxy_redirect http://localhost:5000/ /app1/; #also tried full domain
}

对于该应用程序,我正在使用一个简单的flask应用程序进行测试,如下所示:

@app.route('/')  
def hello_world(): 
    return redirect("http://localhost:5000/testing",code=302)

和浏览器响应标头是:

HTTP/1.1 302 FOUND
Server: nginx/1.14.0 (Ubuntu)
Date: Wed,06 Nov 2019 15:56:24 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Location: http://localhost:5000/testing
heminminzjl 回答:Nginx标头的sub_filter

针对您的情况使用proxy_redirect指令:

proxy_redirect / /app1/;

proxy_redirect / /app2/;

删除任何proxy_redirect off;指令,因为它会取消所有proxy_redirect指令在同一级别上的作用。

本文链接:https://www.f2er.com/3158438.html

大家都在问