У меня есть сайт, работающий в Google App Engine с частным DNS.
Но каждый раз, когда я открываю этот веб-сайт, он открывается как http, я пытался использовать декоратор before_request на фляже, чтобы изменить http на https, но я получаю ошибку too_many_redirects, я также пытался использовать ProxyFix, но так как моя страница не имеет X-Forwarded-Proto как заголовок не перенаправляет на правильную страницу.
EDIT: Я забыл упомянуть, что я использую гибкую среду
Каков наилучший способ настроить это поведение? Где я могу установить эту конфигурацию и, если возможно, как ее установить?
Вот как я пытался перенаправить:
@app.before_request
def before_request():
if request.endpoint in app.view_functions and request.headers.get('X-Forwarded-Proto', None) == 'http':
code = 301
return redirect(request.url.replace('http://', 'https://'), code=code)
спасибо очень много для помощи!
Вы можете напрямую проверить https
:
if request.environ.get('HTTPS') == 'off':
return redirect(...)
или даже:
if not request.is_secure:
return redirect(...)
Но вам также нужно иметь дело со временем, когда вы не хотите перенаправления (localhost, версии, cron jobs и т.д.). Начните с:
#so can test versions, don't redirect appspot urls:
if "appspot" in request.environ.get('HTTP_HOST'):
return None
if os.environ['SERVER_NAME'].startswith('1') or os.environ['SERVER_NAME'].startswith('localhost'):
return None
user_agent = request.environ.get('HTTP_USER_AGENT', 'fake')
# cron, taskqueue, module, development, no redirect
if ( 'AppEngine-Google' in user_agent or
'my-module' in request.environ.get('CURRENT_MODULE_ID')):
return None
Я также запускаю флеш-приложение в приложении. Используйте флажок-талисман и установите для параметра force_https_permanent значение true и force_https значение true https://github.com/GoogleCloudPlatform/flask-talisman
talisman = Talisman (приложение, content_security_policy = csp, content_security_policy_nonce_in = ['script-src'], force_https_permanent = 'true', force_https = 'true')
В примере выше woold также добавлен csp, который также очень полезен для безопасности.
проверьте эту флэшку python на https с http
@app.before_request
def before_request():
if request.url.startswith('http://'):
url = request.url.replace('http://', 'https://', 1)
code = 301
return redirect(url, code=code)
Поскольку вы используете App Engine, вы, вероятно, просто хотите изменить свой app.yaml
чтобы всегда требовать, чтобы URL был безопасным. Например:
- url: .*
script: main.app
secure: always
Параметр seucre: always
гарантирует, что все запросы, направляемые этим правилом, будут зашифрованы. Не нужно вообще включать Flask.
X-Forwarded-Proto
, я не уверен, что вы можете сделать, чтобы выяснить, как добавить https. Я бы сказал, что это больше проблема с вашим прокси, чем с Python или Flask, потому что они не участвуют тогда. Однако я бы попытался создать страницу, которая распечатывает все заголовки ваших запросов, чтобы увидеть, можно ли добавить что-то, что вы можете использовать вместоX-Forwarded-Proto
.