当用户注销时,我使用url_for
生成一个重定向网址:
return redirect(url_for('.index', _external=True))
但是,当我将页面更改为https连接时,url_for
仍然为我提供http。
我想明确地要求url_for
在网址的开头添加https。
你能告诉我怎么改吗?我看了看Flask的文档,没有运气。
发布于 2016-06-16 01:53:12
如果您想要影响所有服务器生成的URL (url_for
和redirect
)的URL方案,而不是在每次调用时都设置_scheme
,那么“正确”的答案似乎是使用WSGI中间件,如下面的代码片段所示:http://flask.pocoo.org/snippets/35/
(This Flask bug似乎证实,这是首选的方式。)
基本上,如果您的WSGI环境有environ['wsgi.url_scheme'] = 'https'
,那么url_for
将生成https:
URL。
我从url_for
获取HTTP,因为我的服务器部署在Elastic Beanstalk负载均衡器后面,后者以常规的http://
与服务器通信。我的解决方案(特定于Elastic Beanstalk)是这样的(从上面链接的代码片段中简化):
class ReverseProxied(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
scheme = environ.get('HTTP_X_FORWARDED_PROTO')
if scheme:
environ['wsgi.url_scheme'] = scheme
return self.app(environ, start_response)
app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)
弹性豆茎特定的部分是HTTP_X_FORWARDED_PROTO
。其他环境可能有其他方法来确定外部URL是否包含https。如果你只想一直使用HTTPS,你可以无条件地设置environ['wsgi.url_scheme'] = 'https'
。
PREFERRED_URL_SCHEME
不是实现这一点的方法。我是ignored whenever a request is in progress。
发布于 2014-10-30 01:23:28
我用https arg尝试了接受的答案,但我发现使用PREFERRED_URL_SCHEME
配置变量并将其设置为https会更容易,方法是:
app.config.update(dict(
PREFERRED_URL_SCHEME = 'https'
))
因为您不必将其添加到每个url_for
调用中。
发布于 2017-08-15 20:45:28
如果你是通过Nginx这样的反向代理来访问你的网站,那么Flask就能正确地判断出该方案是HTTP
。
Browser -----HTTPS----> Reverse proxy -----HTTP----> Flask
最简单的解决方案是配置反向代理来设置X-Forwarded-Proto
标头。Flask将自动检测此标头并相应地管理方案。有一个more detailed explanation in the Flask documentation under the Proxy Setups section。例如,如果您使用Nginx,则必须在location
块中添加以下行。
proxy_set_header X-Forwarded-Proto $scheme;
如前所述,如果您不能更改代理的配置,您可以使用werkzeug ProxyFix或按照文档中的说明构建自己的修复程序:http://flask.pocoo.org/docs/0.12/deploying/wsgi-standalone/#proxy-setups
https://stackoverflow.com/questions/14810795
复制相似问题