Flask启用HTTPS后HTTP请求无法重定向至HTTPS问题排查
Flask启用HTTPS后HTTP请求无法重定向的原因及解决方案
核心原因
当你通过ssl_context参数启动Flask内置服务器时,该服务器只会在指定端口(5051)上监听并处理HTTPS协议的请求。HTTP请求发送到这个端口时,由于协议不匹配,服务器会直接拒绝连接,根本不会将请求传递给Flask的应用逻辑,所以你写的before_request钩子完全不会被触发,也就看不到打印输出。
解决方案
方案1:同时启动HTTP和HTTPS两个Flask服务
通过多线程分别启动两个Flask实例:一个监听HTTP端口(比如5050),专门处理重定向;另一个监听HTTPS端口(5051),处理实际业务逻辑。
示例代码:
from flask import Flask, request, redirect import threading import ssl # 主HTTPS应用 app = Flask(__name__) # 这里添加你的地图服务路由 @app.route('/') def map_service(): return "你的Folium地图页面" # 专门处理HTTP重定向的应用 http_redirect_app = Flask(__name__) @http_redirect_app.before_request def redirect_to_https(): # 替换协议和端口,将HTTP请求重定向到HTTPS new_url = request.url.replace('http://', 'https://', 1).replace(':5050', ':5051', 1) return redirect(new_url, code=301) if __name__ == '__main__': # 加载SSL证书 ssl_context = ssl.SSLContext() ssl_context.load_cert_chain('mycert.pem', 'myprivkey.pem') # 启动HTTPS服务(后台线程) threading.Thread( target=lambda: app.run(debug=False, host='0.0.0.0', port=5051, ssl_context=ssl_context) ).start() # 启动HTTP重定向服务(主线程) http_redirect_app.run(debug=False, host='0.0.0.0', port=5050)
方案2:使用反向代理(推荐生产环境)
生产环境下不建议直接用Flask内置服务器,更推荐用Nginx等反向代理工具处理SSL和重定向:
- 让Nginx监听80(HTTP)和443(HTTPS)端口
- 将所有HTTP请求重定向到HTTPS
- 将HTTPS请求转发到本地运行的Flask服务(无需启用ssl_context)
Nginx配置示例:
# 处理HTTP请求,重定向到HTTPS server { listen 80; server_name 你的域名或IP; return 301 https://$server_name$request_uri; } # 处理HTTPS请求,转发到Flask server { listen 443 ssl; server_name 你的域名或IP; # 配置SSL证书路径 ssl_certificate /path/to/mycert.pem; ssl_certificate_key /path/to/myprivkey.pem; location / { proxy_pass http://127.0.0.1:5051; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
此时Flask只需以普通HTTP模式启动:
app.run(debug=False, host='127.0.0.1', port=5051)
内容的提问来源于stack exchange,提问作者Herve Kabla
相关产品推荐
相关产品推荐

