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 只允许 GETPOSTHEAD

这些设置可在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 的响应)的主要内容,如果未能解决你的问题,请参考以下文章

Django CORS 因来自移动应用程序的发布请求而失败

Axios CORS/Preflight 因 Laravel 5.4 API 调用而失败

Axios 中的 Cors OPTIONS 方法在 Laravel 和 Nginx 中失败

markdown 带有CORS和OPTIONS请求的流明

带有泽西岛的 OPTIONS 请求上的 CORS 标头

Apache CORS OPTIONS 请求状态 501 错误