访问被 CORS 策略阻止:没有“访问控制允许来源”

Posted

技术标签:

【中文标题】访问被 CORS 策略阻止:没有“访问控制允许来源”【英文标题】:Access blocked by CORS policy: No 'Access-Control-Allow-Origin' 【发布时间】:2021-11-03 23:49:48 【问题描述】:

我正在使用以下版本

Python 3.9.6 Django 3.2.3 django-cors-headers==3.7.0

我的 settings.py 中有以下内容

CORS_ALLOW_ALL_ORIGINS=True

CORS_ORIGIN_WHITELIST = ('http://localhost:3000',)

由于某种原因,其中一个 API 调用失败并出现此错误。

CORS 策略阻止了从源获取的访问:请求的资源上不存在“Access->Control-Allow-Origin”标头。如果不透明响应满足 >您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

我无法理解为什么会出现此错误。

以下是从 Google Chrome 开发者工具中提取的相关请求和响应详细信息

常规 请求网址:http://10.0.123.123:8998/api/box?unit=101&box=TOT000000000051345&login_user_id=USERID&reserve_locn=101

请求方法:OPTIONS

状态码:200 OK

远程地址:10.0.123.123:8998

推荐人政策:strict-origin-when-cross-origin

响应标头 Access-Control-Allow-Headers:accept、accept-encoding、authorization、content-type、dnt、origin、user-agent、x-csrftoken、x-requested-with

访问控制允许方法:DELETE、GET、OPTIONS、PATCH、POST、PUT

访问控制允许来源:*

访问控制最大年龄:86400

连接:保持活动

内容长度:0

内容类型:文本/html;字符集=utf-8

日期:格林威治标准时间 2021 年 9 月 7 日星期二 01:15:10

服务器:nginx/1.20.1

变化:原产地

请求标头

选项 /api/box?unit=101&box=TOT000000000051345&login_user_id=USERID&reserve_locn=101 HTTP/1.1

主机:10.0.123.123:8998

连接:保持活动

接受:/

访问控制请求方法:GET

访问控制请求标头:内容类型

来源:http://10.0.123.123:8999

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/92.0.4515.159 Safari/537.36

Sec-Fetch-Mode:cors

推荐人:http://10.0.123.123:8999/

接受编码:gzip、deflate

接受语言:en-GB,en-US;q=0.9,en;q=0.8

【问题讨论】:

你是否在中间件中添加了cors并在django设置中安装了应用程序? 您是否发送凭据请求? 虽然the documentation of django-cors-headers 没有提及,但CORS_ALLOW_ALL_ORIGINS 优先于CORS_ORIGIN_WHITELISTCORS_ALLOWED_ORIGINS 的别名)。如果您检查the source code,这一点就会变得很明显。这不足以解决您的问题,但至少您不需要两个配置。 【参考方案1】:

您用来向 django 服务器发出请求的每个 IP 地址或域都应添加到 settings.py 中,如下所示:

CORS_ORIGIN_WHITELIST = ('http://localhost:3000','http://10.0.123.123:8998')

让我知道 cmets 中的结果。

【讨论】:

试过但没有帮助。此外,将 CORS_ALLOW_ALL_ORIGINS 设置为 True 专门用于允许所有来源,而无需明确指定所有来源。

以上是关于访问被 CORS 策略阻止:没有“访问控制允许来源”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“评估已被 CORS 政策阻止:反应中没有“访问控制允许来源”

请求被 CORS 策略阻止

春季网关请求被 CORS 阻止(无访问控制-允许-来源标头)

为啥我得到“没有访问控制允许来源”

缺少访问控制允许来源[重复]

Vuex Axios CORS 阻止访问控制允许来源