0

我正在构建一个具有两个独立组件的 WebApp:

  1. Web 访问者将访问的“前端”node.js 应用程序服务器(在 localhost:3099 上运行)
  2. 管理我的 ORM 并与数据库对话的“后端”Django 服务器(在 localhost:3098 上运行)。Web 访问者根本不会直接与该服务器交互。该服务器只是发布一个 RESTful API,供前端使用。

我将实施安全限制,以防止除前端服务器之外的任何人访问后端的 API。

后端发布的 API 端点之一如下所示:http://localhost:3098/api/myApi/.

我可以像这样从 curl 成功地访问该 API:curl -X POST -H "Content-Type: application/json" -d '{"myKey1":"myVal1", "myKey2":"myVal2"}' http://localhost:3098/api/myApi/

但是,当我尝试使用 Javascript 从我的前端服务器访问相同的 API 时,我在浏览器的控制台窗口中收到以下错误:

XMLHttpRequest cannot load http://localhost:3098/api/myApi/. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:3099' is therefore not allowed access. 

为了解决这个问题,采取了以下步骤:

  1. 我安装了django-cors-headers
  2. 我添加'corsheaders'到我的INSTALLED_APPS
  3. 我添加'corsheaders.middleware.CorsMiddleware'MIDDLEWARE_CLASSES上面'django.middleware.common.CommonMiddleware'
  4. 我宣布了白名单:CORS_ORIGIN_WHITELIST = ('localhost', '127.0.0.1',)

但是,实施 django-cors-headers 似乎没有任何区别。我仍然收到相同的 CORS 错误。我该如何解决这个问题?

4

1 回答 1

1

CORS 是端口敏感的。规范

If there is no port component of the URI:
1.  Let uri-port be the default port for the protocol given by uri-scheme.
Otherwise:
2.  Let uri-port be the port component of the URI.

如果两个来源是方案/主机/端口三元组,当且仅当它们具有相同的方案、主机和端口时,这两个来源是相同的。

这意味着,随着您的规范 CORS 将您的白名单处理为localhost:80, 127.0.0.1:80. 我相信指定localhost:3099应该可以解决这个问题。

于 2014-09-08T04:46:05.503 回答