Я хочу использовать 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/.
, и было бы здорово, если этого не произойдет, если это полное доменное имя, поэтому можно загружать ресурсы из / app2 / urlв / app1 / page
Есть ли способ, который я могу исправить с помощью конфигурации Nginx, или я могу исправить это только в самом приложении?
EDIT:
Я обнаружил, чтоВ Nginx есть функция sub_filter.
Это заменяет строки в теле ответа.
so: app возвращает: 200 "hello world!"
//nginx
sub_filter "world" "moon";
thenв браузере будет отображаться «привет луна!»
Однако мне также нужно сделать тего для перенаправлений 302.
Существует ли "эквивалент sub_filter" для заголовков?
EDIT2:
Как предположил Иван, вероятно, перенаправление прокси должно сработать, но оно не меняетсячто-нибудь. мой код 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