我有一个使用django-allauth的django应用程序。
我还在生产环境中使用HTTPS部署了它。
来自Web浏览器的AJAX查询指向HTTPS站点,使用POST登录到'/ accounts / login /'按预期返回JSON。
问题在于我的C#移动代码(基于Xamarin)。
_client = new HttpClient(handler) {BaseAddress = uri};
_client.DefaultRequestHeaders.Add("X_REQUESTED_WITH", "XMLHttpRequest");
当用作BaseAddress的'uri'是http并指向我的开发服务器时,一切正常,我在响应中得到了JSON。
然而,当uri指向我的https网站(坐在nginx和gunicorn后面)时,我得到了一个HTML回复。
不知道为什么会这样。有人有任何想法吗?
答案 0 :(得分:5)
https://serverfault.com/questions/508524/preserve-http-headers-from-django-using-nginx-and-gunicorn向我指出了有趣的nginx设置。
underscores_in_headers on;
默认情况下,nginx会阻止其中包含下划线的所有标头,如下所述:http://wiki.nginx.org/Pitfalls
这让我感到疑惑"为什么来自网络浏览器的请求工作但不是我的C#客户端?",答案很微妙。
在Chromium开发者网络标签中,我注意到浏览器发送的标题是" X-Requested-With"。这是由nginx(我认为)映射到" HTTP_X_REQUESTED_WITH"在proxy_pass部分,这正是django正在寻找的。 p>
我在C#代码中进行了一次更改以使其正常工作。我改变了:
_client.DefaultRequestHeaders.Add("X_REQUESTED_WITH", "XMLHttpRequest");
到
_client.DefaultRequestHeaders.Add("X-REQUESTED-WITH", "XMLHttpRequest");
它开始工作了。
我希望这对未来有这个问题的人保持不变。