django - 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。
解决方案
在终于找到一位用户向我发送一些屏幕截图之后。我发现了问题。在与该站点一起使用的浏览器中,对后端的 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 资源。
推荐阅读
- python - 在字符串数组中查找某些元素不等于零的字符串
- c - 编译时出错:“二进制/的无效操作数(具有'short int *'和'int')”
- c++ - c++:为什么我不能为类“内部”的非常量静态成员赋值?
- visual-studio - MSBuild - 如何包含/排除目录?
- r - 无法在 R 中使用 rmarkdown 创建浮动目录
- angular - Angular Jquery Datatable 渲染按钮,单击事件不起作用
- solr - DSE 6.7 solr 搜索总是返回空
- powershell - PowerShell 访问按枚举逐项列出的多维数组
- office-js - Mac 上的 Outlook 2019 中缺少 SeriesId
- wordpress - 为什么将 SSL 域添加到 WordPress 多站点会导致:“潜在的安全风险”警告