CORS 因请求而失败,带有 OPTIONS(状态为 0 的响应)
Posted
技术标签:
【中文标题】CORS 因请求而失败,带有 OPTIONS(状态为 0 的响应)【英文标题】:CORS fails on request with OPTIONS (Response with status: 0) 【发布时间】:2018-02-25 02:23:59 【问题描述】:更新:重写问题,因为我有一些新信息。历史记录在编辑中可见。
问题介绍
我有一个django-rest-framework
应用程序在子域api.nrzonline.nl
上运行。前端ng2 + webpack
应用程序在域本身nrzonline.nl
上运行。在向 API 发送带有 ng2-restangular
的请求时,我在控制台中收到以下错误:
zone.js OPTIONS http://api.nrzonline.com/project/ net::ERR_EMPTY_RESPONSE
EXCEPTION: Response with status: 0 for URL: null
当前问题
经过相当多的 curls 测试,我发现当发送带有OPTIONS
的预检请求时,所有请求都失败了。
-X GET
的请求正常工作:
curl 'api.nrzonline.nl/skill/' -X GET
["id":1,"category":"id":1,"title":"skill-a",...]
-X OPTIONS
的(预检)请求失败,没有响应
curl 'api.nrzonline.nl/skill/' -X OPTIONS
curl: (52) Empty reply from server
在 Django 开发服务器上的 API 上执行此 -x OPTIONS
请求在本地可以正常工作。
服务器设置
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS
是默认设置,允许OPTIONS
CORS_ALLOW_HEADERS
是默认设置
中间件:
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
我的尝试
我读到服务器可能需要 HTTPS 请求,但目前没有活动的 SSL 证书。 (source) 不过,我确实尝试过curl
和 --insecure
(source)
以text/plain
发送请求,而不是application/json
和-H "Content-Type: text/plain"
(source (comment on answer))
问题
我错过了什么/做错了什么,所以-X OPTIONS
的预检失败了。欢迎提供任何提示、解释或参考可能的解决方案。
【问题讨论】:
【参考方案1】:请回答我的兄弟,我网站的主持人
问题与DirectAdmin 相关。默认情况下,DirectAdmin 只允许 GET
、POST
和 HEAD
。
这些设置可在include /etc/nginx/webapps.conf;
中找到:
if ($request_method !~ ^(GET|HEAD|POST)$ )
return 444;
添加OPTIONS
应该可以解决问题。删除或注释掉代码块以允许任何请求方法。
但是,修改 /etc/nginx/webapps.conf
可能会导致 DirectAdmin 在新的 HTTPD 更新期间覆盖此文件。文件<path_to_directadmin>/custombuild/costum/nginx/conf
用于生成conf
文件。在此处进行修改应该可以防止丢失您的调整。
【讨论】:
以上是关于CORS 因请求而失败,带有 OPTIONS(状态为 0 的响应)的主要内容,如果未能解决你的问题,请参考以下文章
Axios CORS/Preflight 因 Laravel 5.4 API 调用而失败