访问被 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_WHITELIST
(CORS_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 政策阻止:反应中没有“访问控制允许来源”