在Heroku上使用Gunicorn无法将HTTP转发至HTTPS的问题
在Heroku上为Dash应用强制HTTPS重定向的解决方案
你的gunicorn配置仅用于让应用识别Heroku路由器转发的HTTPS请求标识,本身不会主动触发HTTP到HTTPS的重定向。要实现强制跳转,需要在Dash底层的Flask框架中添加请求拦截逻辑,结合Heroku的请求头判断处理。
方法一:添加Flask请求钩子实现重定向
Dash基于Flask开发,可通过before_request钩子在每个请求到达前检查协议,若为HTTP则重定向到HTTPS:
from dash import Dash, html from flask import redirect, request # 初始化Dash应用 app = Dash(__name__) # 强制HTTPS重定向逻辑 @app.server.before_request def enforce_https(): # 仅在生产环境(Heroku)生效,避免影响本地开发 if request.headers.get('X-Forwarded-Proto', 'http') != 'https': # 替换协议为HTTPS并返回永久重定向 secure_url = request.url.replace('http://', 'https://', 1) return redirect(secure_url, code=301) # 你的Dash应用布局 app.layout = html.Div([ html.H1("HTTPS Only Dashboard") ]) # 启动应用(生产环境由gunicorn接管,此处仅用于本地调试) if __name__ == '__main__': app.run_server(debug=True)
方法二:确保gunicorn配置正确加载
若怀疑配置文件未被正确读取,可直接在Procfile中指定参数,规避路径问题:
web: gunicorn --forwarded-allow-ips='*' --secure-scheme-headers='{"X-FORWARDED-PROTO": "https"}' app:server
该配置让gunicorn信任Heroku转发的HTTPS标识,配合上述Flask重定向逻辑即可完成强制跳转。
关键说明
Heroku请求先经过其路由器再转发到应用,应用无法直接获取原始请求协议,必须通过X-Forwarded-Proto请求头判断用户实际使用的协议。gunicorn配置是让应用信任这个头,而重定向逻辑需要在应用层面主动实现。
内容的提问来源于stack exchange,提问作者benbyford
相关产品推荐
相关产品推荐

