CORS 在使用 OPTIONS 请求时失败(响应状态:0)
CORS fails on request with OPTIONS (Response with status: 0)
更新:重写问题,因为我得到了一些新信息。历史在编辑中可见。
问题介绍
我在子域 api.nrzonline.nl
上有一个 django-rest-framework
应用程序 运行。前端 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) Though, I did try to
curl
with --insecure
(source)
- 将请求作为
text/plain
而不是 application/json
和 -H "Content-Type: text/plain"
(source (comment on answer))
问题
我错过了什么/做错了什么,所以 -X OPTIONS
的预检失败了。欢迎任何提示、解释或参考可能的解决方案。
答案归功于我的兄弟,我网站的托管人
此问题与 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
文件。在此处进行修改应该可以防止丢失您的调整。
更新:重写问题,因为我得到了一些新信息。历史在编辑中可见。
问题介绍
我在子域 api.nrzonline.nl
上有一个 django-rest-framework
应用程序 运行。前端 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) Though, I did try to
curl
with--insecure
(source) - 将请求作为
text/plain
而不是application/json
和-H "Content-Type: text/plain"
(source (comment on answer))
问题
我错过了什么/做错了什么,所以 -X OPTIONS
的预检失败了。欢迎任何提示、解释或参考可能的解决方案。
答案归功于我的兄弟,我网站的托管人
此问题与 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
文件。在此处进行修改应该可以防止丢失您的调整。