Nginx sub_filter для заголовков - PullRequest
1 голос
/ 05 ноября 2019

Я хочу использовать 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

1 Ответ

1 голос
/ 06 ноября 2019

Используйте директиву proxy_redirect для вашего случая:

proxy_redirect / /app1/;

и

proxy_redirect / /app2/;

Удалите любую директиву proxy_redirect off;, поскольку она отменяет действие всехproxy_redirect директивы на том же уровне.

...