为什么我的 C# AJAX 请求使用 HTTP 而使用 HTTPS 失败

本文关键字:HTTPS 失败 HTTP 我的 AJAX 请求 为什么 | 更新日期: 2023-09-27 18:34:11

我有一个使用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");

当用作基址的"uri"是http并指向我的开发服务器时,一切正常,我在响应中返回JSON。

但是,当 uri 指向我的 https 站点(位于 nginx 和 gunicorn 后面)时,我得到了一个 HTML 响应。

不知道为什么会这样。 有人有什么想法吗?

为什么我的 C# AJAX 请求使用 HTTP 而使用 HTTPS 失败

好的,终于找到了答案。 男孩是个好东西。

https://serverfault.com/questions/508524/preserve-http-headers-from-django-using-nginx-and-gunicorn 向我指出了有趣的nginx设置。

underscores_in_headers继续;

默认情况下,nginx 会阻止任何包含下划线的标头,如下所述: http://wiki.nginx.org/Pitfalls

这让我想知道"为什么来自 Web 浏览器的请求有效,而我的 C# 客户端不起作用?",答案是微妙的。

在Chromium开发者网络选项卡中,我注意到从浏览器发送的标头是"X-Request-With"。 这是nginx(我认为)映射到proxy_pass部分中的"HTTP_X_REQUESTED_WITH",这正是django正在寻找的。

我在 C# 代码中进行了一项更改以使其正常工作。 我改变了:

_client.DefaultRequestHeaders.Add("X_REQUESTED_WITH", "XMLHttpRequest");

_client.DefaultRequestHeaders.Add("X-REQUESTED-WITH", "XMLHttpRequest");

它开始工作。

我希望这能留给未来有这个问题的人。