команда перенаправления фляги идет к http, а не к https - PullRequest
1 голос
/ 10 ноября 2019

У меня есть приложение фляги за сервером nginx. Nginx обрабатывает завершение SSL и перенаправляет на https. Все http-запросы перенаправляются.

В колбе, о которой я не думаю, что мне следует об этом знать, у меня есть этот бит кода:

@bp.route('/', methods=['GET', 'POST'])
def index_root():
    """Assign a session tag.

    """
    return redirect(url_for('main.index', tag=make_new_tag()))

@bp.route('/D/<tag>/accueil', methods=['GET', 'POST'])
def index(tag):
    return render_template('index.html', title='', tag=tag)

Теперь у меня естьпроблема: когда кто-то запрашивает http://example.com/, он равен 301 по nginx до https://www.example.com/, что правильно. Затем переместите 302 для них на http://www.example.com/D/123/accueil, что не так хорошо, потому что nginx просто скомбинирует их с 301 до https://www.example.com/D/123/accueil (что хорошо, но я бы предпочел пропустить этот дополнительный редирект).

Этопроблема конфигурации где-нибудь?

Обратите внимание, что в dev важно, чтобы фляга действительно не думала о https. Действительно, фляге вообще не нужно ничего знать о https, и именно поэтому я нахожу это немного загадочным.

Спасибо за любые указатели.

1 Ответ

0 голосов
/ 15 ноября 2019

Похоже, что текущий способ достижения этого - передача x_proto=1 в качестве аргумента промежуточному программному обеспечению Werkzeug ProxyFix:

from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)

app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1 ,x_proto=1)

Обязательно установите x_for правильно, в соответствии с документами . Это значение равно числу прокси и должно быть правильным по соображениям безопасности, иначе Flask может доверять некоторым заголовкам, установленным пользователем Интернета, как если бы они пришли с обратного прокси. Опасность заключается в установке этого значения в 1, когда прокси отсутствует.

Тогда в nginx убедитесь, что вы устанавливаете заголовок X-Forwarded-Proto в блоке местоположения, перед вашим proxy_pass:

 location  / {
    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_pass http://localhost:9999/;
  }

Я не проверял это с помощью nginx, но смог протестировать непосредственно на сервере dev и gunicorn, настроив этот заголовок специально в curl:

curl -is http://localhost:5000/  -H 'X-Forwarded-Proto: https'

Возвращает:

HTTP/1.0 302 FOUND
Location: https://localhost:5000/test_str/accueil`

Таким образом, похоже, действует url_for, который не требует изменения отдельных url_for() вызовов в вашем коде, как в случае с принятым ответом, связанным с @ PGHE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...