将http重定向到https flask + appengine

时间:2018-10-19 17:12:04

标签: python google-app-engine flask

我有一个运行在带有私人DNS的Google App Engine上的网站。

但是每次我打开该网站以http打开时,我都尝试在烧瓶上使用before_request装饰器将http更改为https,但是我收到too_many_redirects错误,我也尝试使用ProxyFix,但是由于我的页面没有X-Forwarded -Proto作为标题,它不会重定向到正确的页面。

编辑:我忘了提到我正在使用Flex环境

配置此行为的最佳方法是什么?在哪里可以设置此配置?如果可以的话,该如何设置?

这就是我尝试重定向的方式:

@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)

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

您可以使用以下方法直接检查https

if request.environ.get('HTTPS') == 'off':
    return redirect(...)

甚至:

if not request.is_secure:
    return redirect(...)

但是,您还必须处理不需要重定向的时间(本地主机,版本,cron作业等)。开始于:

#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

答案 1 :(得分:0)

检查一下 python flask redirect to https from 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)

答案 2 :(得分:0)

由于您正在使用App Engine,因此您可能只想更改app.yaml以始终要求网址安全。例如:

- url: .*
  script: main.app
  secure: always

seucre: always标志可确保使用该规则路由的所有请求均被加密。完全不需要Flask。

答案 3 :(得分:0)

我也在App Engine上运行flask应用程序。使用flask-talisman并将force_https_permanent设置为true并将force_https设置为true https://github.com/GoogleCloudPlatform/flask-talisman

滑行者=护符(     应用程式     content_security_policy = csp,     content_security_policy_nonce_in = ['script-src'],     force_https_permanent ='true',     force_https ='true' )

woold上面的示例还添加了一个csp,它对于安全性也非常有用。