我想在运行于各自端口上的不同应用程序之前使用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