Обработка колбы url_for за обратным прокси nginx - PullRequest
0 голосов
/ 30 октября 2019

У меня есть приложение фляги, использующее nginx для завершения обратного прокси / ssl, но у меня возникают проблемы при использовании url_for и перенаправления в фляге.

Запись nginx.conf:

location /flaskapp {
  proxy_pass http://myapp:8080/;
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Идея состоит в том, что пользователь переходит на

https://localhost:port/flaskapp/some/location/here

, и его следует передать колбе как

http://localhost:8080/some/location/here

Thisработает достаточно хорошо при переходе к определенному маршруту, однако, если маршрут имеет redirect(url_for('another_page')), браузер перенаправляется на

http://localhost:8080/another_page

и дает сбой, когда URL, который я действительно хочу перейтиto is:

https://localhost:port/flaskapp/another_page

Я пробовал несколько других ответов для подобных ситуаций, но, похоже, ни один из них не делал именно то, что я делаю здесь. Я попытался использовать _external=True, установить app.config['APPLICATION_ROOT'] = '/flaskapp' и множество итераций различных команд proxy_set_header в nginx.conf, но безуспешно.

В качестве дополнительного усложнения мое колб-приложение использует flask-login и CSRF. печенье. Когда я попытался установить APPLICATION_ROOT, приложение перестало считать файл cookie CSRF установленным flask-login действительным, что, как я полагаю, как-то связано с происхождением.

Поэтому мой вопрос: как мне сделать так, чтобы приflask возвращает redirect() клиенту, nginx понимает, что указанный ему адрес должен flaskapp записываться в него?

1 Ответ

0 голосов
/ 31 октября 2019

Мне удалось исправить это с некоторыми изменениями.

Изменить 1. Добавление / flaskapp к маршрутам в моем приложении фляги. Это избавило от необходимости переписывать URL-адреса и значительно упростило процесс.

Изменение 2. Изменения в nginx.conf. Я добавил logc в блок местоположения, чтобы перенаправить http-запросы как https, новый conf:

location /flaskapp {
  proxy_pass http://myapp:8080/;
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  # New configs below
  proxy_set_header X-Real-IP $remoteaddr;
  proxy_set_header X-Forwarded-Proto $scheme;
  # Makes flask redirects use https, not http.
  proxy_redirect http://$http_host/ https://$http_host/;
}

Пока я не «решил» проблему введения условных перезаписей на основе известного префикса, поскольку мне нужно толькоодин префикс для этого приложения - это приемлемое решение, чтобы запечь его на маршрутах.

...