Django CORS 标头白名单不起作用

Posted

技术标签:

【中文标题】Django CORS 标头白名单不起作用【英文标题】:Django CORS headers whitelist doesn't work 【发布时间】:2020-03-05 00:20:16 【问题描述】:

我正在开发一个现有的代码库,该代码库由一个 Django 后端和一个 ReactJS 前端组成。 一切都是码头化的,所以我在localhost:8001 上运行后端,在localhost:3000 上运行前端。

因为我在浏览器中遇到了 CORS 错误,所以我在 Django 中添加了django-cors-headers。但是,当我添加 CORS_ORIGIN_ALLOW_ALL = True 时,我收到一条错误消息

跨域请求被阻止:同源策略不允许读取位于“http://127.0.0.1:8001/devices/”的远程资源。 (原因:如果 CORS 标头“Access-Control-Allow-Origin”为“*”,则不支持凭据。

然后我添加了以下设置:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    'http//:127.0.0.1:3000',
    'http//:127.0.0.1:8001',
)

但是我得到一个错误提示

CORS 标头“Access-Control-Allow-Origin”缺失

为什么白名单不起作用?我在这里做错了吗?

【问题讨论】:

错字:问题中显示的设置具有以http//: 开头的值——但它们应该以http:// 开头。 【参考方案1】:

当您拥有CORS_ORIGIN_ALLOW_ALL = True 时,这将设置Access-Control-Allow-Origin: *,并且正如错误所暗示的那样,在允许跨域请求的所有域时,您不能在请求中传递credentials 标志。因此,如果您想将标头保留为 Access-Control-Allow-Origin: *,最简单的解决方法是在从前端发送 CORS 请求时不使用 credentials 标志。

如果您只想允许某些域(这是可取的),您需要先找到有效域。请记住,这些域是请求到达 Django 的源域。您可以通过查看request.META.REMOTE_HOST 找到它们。 request.META 是 WSGI 看到和传递的环境,如果你在中间有一些代理,那会给你代理链中的最后一个主机。

如果您有一个与 WSGI 通信的 Web 服务器,例如nginx,它会将REMOTE_HOST 传递给您的Django 应用程序或您拥有的任何中间WSGI 服务器(例如uWSGI/gunicorn),然后它们会将其传递给您的应用程序。


另外,在您的设置中,CORS_ORIGIN_WHITELIST 中的 URL 格式错误; scheme 和 netloc 之间的分隔符是 ://,而不是 //: 例如:

http://127.0.0.1:3000

【讨论】:

【参考方案2】:

当您在本地运行前端代码时,在您的浏览器中安装任何跨源浏览器扩展,这将很有帮助。

并将白名单网址更改为如下(//:应为://):

CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:3000',
'http://127.0.0.1:8001',
)

【讨论】:

以上是关于Django CORS 标头白名单不起作用的主要内容,如果未能解决你的问题,请参考以下文章

(Jquery、Ajax、Django、Cors、GET)没有“Access-Control-Allow-Origin”标头 - 忽略 Cors 白名单

TailwindCSS / PurgeCSS 白名单不起作用

Phonegap 和 Android 4.4.2 白名单不起作用

AngularJS和rails cors标头不起作用

Android Phonegap 3 webapp白名单不起作用

.htaccess 拒绝所有-> 目录索引不起作用(拒绝所有和白名单文件)