编程语言
首页 > 编程语言> > python – 对Tastypie的POST请求返回一个非SSL位置标头

python – 对Tastypie的POST请求返回一个非SSL位置标头

作者:互联网

我正在为我的Tastypie api做一个POST请求,它创建了一个资源.
它通常通过响应中的Location标头返回资源uri.
我遇到的问题是Location头包含一个非ssl url,即使我的初始请求(以及我的整个应用程序)都在https下.

从我的请求标题:

URL: https://example.com/api/v1/resource/

从我的回复标题:

Location: http://example.com/api/v1/resource/80/

因为这是一个并不总是在ssl下运行的可重用应用程序,所以我不想硬编码一个丑陋的字符串替换.此外,已经有一个301重定向,从http到https,但我不希望重定向发生.

所有帮助赞赏!

更新:
这实际上与Tastypie没有任何关系,这是因为服务器/代理配置.有关解决方案的详细信

解决方法:

原因很简单:貌似request.is_secure()在您的情况下返回False,因此URL使用http而不是https构造.

有几种解决方案,但您应首先找到导致request.is_secure()返回False的原因.我打赌你在一些代理或负载均衡器后面运行.如果您没有更改URL生成背后的逻辑,那么这可能是您的问题的原因.

要解决此问题,您可以查看SECURE_PROXY_SSL_HEADER setting in Django,它定义了表示与代理或负载均衡器建立的SSL连接的标头:

If your Django app is behind a proxy, though, the proxy may be “swallowing” the fact that a request is HTTPS, using a non-HTTPS connection between the proxy and Django. In this case, is_secure() would always return False — even for requests that were made via HTTPS by the end user.

In this situation, you’ll want to configure your proxy to set a custom HTTP header that tells Django whether the request came in via HTTPS, and you’ll want to set SECURE_PROXY_SSL_HEADER so that Django knows what header to look for.

但是,如果您正在设计一个可重复使用的应用程序,并且上述情况在您的情况下是正确的,请确保它不是不同的东西.如果您确定是这种情况,那么请将其留给用户 – 负责安全请求指示的标头应该由显式设置,只有使用您的应用程序的程序员才能设置.否则,这可能意味着安全问题.

标签:python,django,ssl,tastypie
来源: https://codeday.me/bug/20190529/1181414.html