我正在尝试创建一个简单的烧瓶服务器,它可以将任何http请求重定向到https。我已经创建了一个证书和密钥文件,并注册了一个before_request
挂钩,以查看请求是否安全并适当地重定向,并遵循建议这就是答案。
烧瓶服务器按预期响应https请求。但是,当我发送http请求时,before_request
钩子永远不会被调用,服务器永远挂起。如果我从浏览器发送http请求,我会看到一个"ERR_EMPTY_RESPONSE“。之后,服务器甚至不响应https请求。也没有打印日志。
使用gunicorn运行这个应用程序也没有帮助。唯一的区别是古尼科恩能够发现工人被冻住了,并最终杀死并替换了它。我也尝试过使用flask-talisman
,结果也是一样的。
下面是我正在运行的代码
### server.py
from flask import Flask, request, redirect
def verify_https():
if not request.is_secure:
url = request.url.replace("http://", "https://", 1)
return redirect(url, 301)
def create_flask_app():
app = Flask(__name__)
app.before_request(verify_https)
app.add_url_rule('/', 'root', lambda: "Hello World")
return app
if __name__ == '__main__':
app = create_flask_app()
app.run(
host="0.0.0.0",
port=5000,
ssl_context=('server.crt', 'server.key')
)
使用python3.8 server.py
或gunicorn --keyfile 'server.key' --certfile 'server.crt' --bind '0.0.0.0:5000' 'server:create_flask_app()'
运行它,并打开浏览器窗口到localhost:5000
,会导致服务器挂起。
发布于 2022-10-17 12:37:28
说到结冰,这不是。烧瓶和金牛只能服务于一种不同的连接。。所以没有冻结,因为你的浏览器取消了请求并在闲置。
我认为如果您想要将HTTP更改为HTTPS,最好使用更快的web服务器,例如Nginx。我会推荐它给你的。
但是,如果同时运行多个gunicorn实例,则有可能触发verify_https函数。
我以您的例子为例,生成了一个证书,然后在我的控制台中运行这个脚本(它包含一个后台作业,可以在两个单独的ter中运行)
gunicorn --bind '0.0.0.0:80' 'server:create_flask_app()' & gunicorn --certfile server.crt --keyfile server.key --bind '0.0.0.0:443' 'server:create_flask_app()'
现在,chrome按预期的方式转到安全页面。
发布于 2022-10-14 11:28:58
通常,服务器不会同时侦听同一端口上的http和https。我对个人投资组合也有类似的要求,但我使用nginx将http请求(端口80)转发到https (端口443),然后https服务器将其传递给我的uwsgi后端,后者监听端口3031。这可能比你需要的要复杂得多,但是一个可能的解决方案。如果你走那条路,我会根据你的证书需求推荐让你加密。它将为您设置证书和nginx.conf。
如果您不想使用完整的nginx/apache路由,我认为最简单的解决方案就是在您所链接的线程上建议的这里。
https://stackoverflow.com/questions/68585231
复制