首页 > 解决方案 > nginx API 跨源调用仅在某些浏览器中不起作用

问题描述

TLDR:React 应用程序的 API 调用返回状态码 200,但没有正文响应,仅在从某些浏览器访问 Web 应用程序时发生。

我在单个 centOS7 虚拟机上使用 nginx 和 uwsgi 部署了一个 React + Django 应用程序。

React 应用程序由域上的 nginx 提供服务,当用户登录 javascript 应用程序时,REST API 请求会发送到子域(即:backend.mydomain.com)上的同一个 nginx,用于验证令牌和获取数据。

这适用于所有最新版本的 Firefox、Chrome、Safari 和 Edge。但是,一些用户抱怨他们无法从工作网络登录。他们可以访问该站点,因此很明显 javascript 应用程序已提供给他们,但是当他们登录时,所有请求都返回状态 200,除了响应的正文为空。(并且登录需要一些信息与登录一起发回以响应工作)。

例如,当我从我所在的位置登录时,我会得到状态 = 200 的响应,以及响应正文中带有少量参数的 json 对象。

但是当其中一位用户从他们的浏览器中向我展示了相同的内容时,他们得到了 Status=200,但响应是空的。他们使用与我相同版本的浏览器。他们以相同的行为尝试了 Firefox 和 Chrome。

标签: djangonginxhttpsnetwork-programmingfirewall

解决方案


在终于找到一位用户向我发送一些屏幕截图之后。我发现了问题。在与该站点一起使用的浏览器中,对后端的 API 调用已Referrer Policy设置为strict-origin-when-cross-origin标头中。但是在他们的浏览器上,同样显示为no-referrer-when-downgrade.

我没有明确设置推荐人策略,因此浏览器使用它们的每个默认值,并且不同版本的浏览器之间存在差异(https://developers.google.com/web/updates/2020/07/referrer-policy-新铬默认

为了解决这个问题,我添加add_header 'Referrer-Policy' 'strict-origin-when-cross-origin';到 nginx.conf 文件并重新启动服务器。更多详细信息:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy

之前遇到问题的用户现在可以在清除浏览器中的缓存后访问站点 API 资源。


推荐阅读