@detcelfer

Как исправить некорректную обработку редиректов при использовании Nginx reverse proxy?

Изначальная задача: настроить NGINX для передачи трафика flask приложению работающему на 127.0.0.1:5000

Найден баг:
при переходе с любой страницы сайта на страницу https://domain.com/en возникает некорректное
перенаправление:
Пример:
со страницы https://domain.com ссылка ведёт на https://domain.com/en
перенаправление идет на domain.com%2Cdomain.com/en
Другой пример:
со страницы https://domain.com/en/signin ссылка ведёт на https://domain.com/en
перенаправление идет на domain.com%2Cdomain.com/en
Примеры удачного перенаправления:
1) со страницы https://domain.com/en/ ссылка ведёт на https://domain.com/en/signin
перенаправление идет на https://domain.com/en/signin
2) со страницы https://domain.com/en/signin ссылка ведёт на https://domain.com/en/signup
перенаправление идет на https://domain.com/en/signup

Из-за чего возникает этот странный редикект на domain.com%2Cdomain.com/en ?
url decoder говорит, что %2C это ',' (запятая).

Замечу, что подобной ошибки не возникает без использования Nginx reverse proxy.
файл конфигурации nginx.
Nginx config
# block for certbot
server {
    listen 80;
    server_name domain.com;
    location /.well-known/acme-challenge {
         root /usr/share/nginx/html;
    }
    location / {
         return 301 https://$host$request_uri;
    }
}

# main block
server {
    
    listen 443 ssl;
    server_name domain.com;

    #SSL:
    ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://127.0.0.1:5000;
        #proxy_redirect off;
        #proxy_redirect https://domain.com/ http://127.0.0.1:5000/;

        # proxy headers  
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';

       # proxy_cache_bypass $http_upgrade;
       # proxy_headers_hash_max_size 512;
       # proxy_headers_hash_bucket_size 128;        
        include proxy_params;
    }
    
}


Со стороны flask :
Flask app

прошу не разводить со стороны умельцев палемику на тему грамотности перевода страниц на иностранный язык. код не мой, приходится работать с тем, что есть.

__init__.py:
app.register_blueprint(auth, url_prefix='/')
app.register_blueprint(views, url_prefix='/')
app.register_blueprint(views_en, url_prefix='/en')
app.register_blueprint(auth_en, url_prefix='/en')

views_en.py:
@views_en.route('/', methods=['GET', 'POST'])
def home():
    ...
    render_template("en_templates/home.html")

  • Вопрос задан
  • 256 просмотров
Решения вопроса 1
@detcelfer Автор вопроса
Выявлено дублирование http заголовка location из-за некорректых параметров блока server в nginx reverse proxy.
аналогичная проблема решена здесь: https://stackoverflow.com/questions/64233343/flask...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы