相关疑难解决方法(0)

如何允许CORS?

我试图在我的Node.js应用程序中支持使用Express.js Web框架的CORS.我已经阅读有关如何处理此问题的Google小组讨论,并阅读了一些有关CORS如何工作的文章.首先,我这样做了(代码是用CoffeeScript语法编写的):

app.options "*", (req, res) ->
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  # try: 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
  # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...
Run Code Online (Sandbox Code Playgroud)

它似乎不起作用.好像我的浏览器(Chrome)没有发送初始OPTIONS请求.当我刚刚更新资源块时,我需要将跨源GET请求提交到:

app.get "/somethingelse", (req, res) ->
  # ...
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...
Run Code Online (Sandbox Code Playgroud)

它有效(在Chrome中).这也适用于Safari.

我读过......

在实现CORS的浏览器中,每个跨源GET或POST请求前面都有一个OPTIONS请求,用于检查GET或POST是否正常.

所以我的主要问题是,为什么在我的案例中似乎没有发生这种情况?为什么我的app.options块没有被调用?为什么我需要在主app.get块中设置标题?

node.js cors coffeescript express

609
推荐指数
17
解决办法
57万
查看次数

预检和重定向的CORS请求:不允许.解决方法?

我正在设计一个API,允许用户进行身份验证(使用令牌)并在同一域中包含重定向.现在,对于返回303的端点的未经身份验证的请求,

GET /documents/123  --> 303 redirect to `/documents/abc`
GET /documents/abc  --> 200
Run Code Online (Sandbox Code Playgroud)

一切顺利.

让我们对Authorization发送标头的同一端点进行经过身份验证的请求.这使得请求成为预先请求,并且浏览器执行预检OPTIONS请求,即

OPTIONS /documents/123   --> 204 (everything okay, please proceed)
GET /documents/123       --> 303 redirect to `/documents/abc`
Run Code Online (Sandbox Code Playgroud)

此时,浏览器产生的不是GET实际资源/documents/abc

XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe. 
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie', 
which is disallowed for cross-origin requests that require preflight.
Run Code Online (Sandbox Code Playgroud)

此行为符合标准:

7.1.5带预检的跨源请求

如果响应的HTTP状态代码不在2xx范围内

应用网络错误步骤.

这似乎意味着即使重定向位于同一个域(),也无法对经过身份验证的资源进行重定向localhost.

这真的可以吗?有一个共同的解决方法吗?

redirect http cors preflight

24
推荐指数
1
解决办法
3万
查看次数

标签 统计

cors ×2

coffeescript ×1

express ×1

http ×1

node.js ×1

preflight ×1

redirect ×1