对Tastypie的POST请求返回非SSL位置标头

Gee*_*ish 4 python django ssl tastypie

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

从我的请求标题:

URL: https://example.com/api/v1/resource/
Run Code Online (Sandbox Code Playgroud)

从我的回复标题:

Location: http://example.com/api/v1/resource/80/
Run Code Online (Sandbox Code Playgroud)

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

所有帮助赞赏!

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

Tad*_*eck 6

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

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

要解决这个问题,您可以查看SECURE_PROXY_SSL_HEADERDjango中的设置,该设置定义了表示与代理或负载均衡器建立的SSL连接的标头:

但是,如果您的Django应用程序位于代理后面,则代理可能会"吞咽"请求为HTTPS,使用代理和Django之间的非HTTPS连接.在这种情况下,即使对于最终用户通过HTTPS发出的请求,is_secure()也会始终返回False.

在这种情况下,您需要配置代理以设置自定义HTTP标头,告知Django请求是否通过HTTPS进入,并且您需要设置SECURE_PROXY_SSL_HEADER以便Django知道要查找的标头.

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