如果我尝试通过HTTPS使用Flask RestPlus提供Swagger UI,我只会在根URL上看到“No spec provided”错误消息,并且从不加载完整的Swagger UI。但是,如果我访问API端点,则会按预期返回响应。
查看错误页面的源HTML,我注意到swagger.json
是从http://myhost/
而不是https://myhost/
获取的
我在the restplus Github issues上发现了完全相同的问题
我已经在该页面上提到的the monkey-patch暂时解决了我的问题。加载Swagger UI,并查看HTML源代码,我看到swagger.json
确实是从https://myhost
获取的。
为什么会发生这种情况,如何在没有猴子补丁的情况下修复它?
HTTPS是由Cloudflare的“灵活”HTTPS服务提供的。
我的应用程序是Nginx背后的配置因此,并且我没有引起任何问题,据我所知:
...
http {
...
server {
location / {
charset UTF-8;
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
charset UTF-8;
proxy_intercept_errors on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:5000;
}
}
}
我用下面的方法来实现它。您可以在下面的链接中查看稳定示例。
http://flask-restplus.readthedocs.io/en/stable/example.html
from werkzeug.contrib.fixers import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
我不确定这是完全安全的,但这是我在Nginx中修复它的方法:
sub_filter "http://$host/" "https://$host/";
sub_filter_once off;
proxy_redirect off;
我正在Nginx上卸载SSL,这对我没有任何问题。它还消除了猴子补丁应用程序代码的需要。
您从flask-restplus问题中列出的方法肯定被认为是不安全的:
Please keep in mind that it is a security issue to use such a
middleware in a non-proxy setup because it will blindly trust
the incoming headers which might be forged by malicious clients.