使用OPTIONS请求CORS失败(响应状态:0)

时间:2017-09-15 20:48:16

标签: curl cors django-rest-framework django-cors-headers

更新:由于我获得了一些新信息,因此重写了这个问题。历史记录在编辑中可见。

问题介绍
我在子域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

当前问题
经过一些卷发测试后,我发现当发送带有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--insecuresource
  • 使用text/plain application/jsonsource (comment on answer)
  • -H "Content-Type: text/plain"而不是-X OPTIONS发送请求

问题
我错过了什么/做错了什么,因此def waitForThread(delay,my_threads): time.sleep (delay) for t in my_threads: t.join () if t in my_threads: my_threads.remove (t) return 的预检失败了。欢迎提供有关可能解决方案的任何提示,解释或参考。

1 个答案:

答案 0 :(得分: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文件。在此进行修改可以防止丢失调整。