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 白名单不起作用