Express 默认会禁用 CORS 吗?

Posted

技术标签:

【中文标题】Express 默认会禁用 CORS 吗?【英文标题】:Does Express disable CORS by default? 【发布时间】:2018-06-13 02:56:22 【问题描述】:

我被要求确保我设置的新快速服务器强制执行跨域资源共享 (CORS),除非请求来自特定 URL。

我在这里找到了官方的express CORS中间件:https://github.com/expressjs/cors

如果我想为所有请求启用 CORS,那么我只需要添加 app.use(cors())

如果我只想允许指定的 url,那么我可以这样传递它们:

var corsOptions = 
  origin: 'http://example.com',
  optionsSuccessStatus: 200 


app.use(cors(corsOptions))

正确吗?

如果我想阻止所有来源/URLS 访问我服务器上的资源怎么办?

这只是 Express 的默认行为吗?

如果我跳过了上面的所有代码,那么我的服务器将受到保护,不受所有请求的影响?

如果我没有使用 CORS 中间件启用 CORS,我如何使用 postman 测试服务器请求?

谢谢!

【问题讨论】:

【参考方案1】:

如果您不启用 CORS 中间件,您的服务器响应将不包含 CORS 标头,并且浏览器将回退到标准 same-origin policy(即只有相同协议、域和端口上的脚本可以访问它)。

请注意,这些都不是在服务器端强制执行的 - CORS 只是向浏览器提供信息以允许它做出决定,并且没有什么可以阻止浏览器实现简单地忽略 CORS 标头或同源策略.例如,像 Postman 这样的 HTTP 客户端通常会完全忽略 CORS,因为它与它们无关。

【讨论】:

【参考方案2】:

CORS 仅在浏览器中发挥作用,仅当来自不同域的网页尝试访问您的资源时。您可以手动检查 ctx 中的原始标头(不使用任何预构建的中间件)

 const origin = ctx.get('origin');
 //check if you want to allow this origin
 //if you want to allow it,
 ctx.set('Access-Control-Allow-Origin', origin);
 //else do not set the header or set it something else
 ctx.set('Access-Control-Allow-Origin', 'blahblah.com');

浏览器会先向服务器发送OPTIONS请求,看它是否允许当前的来源,如果不允许,浏览器就不会继续发出原来的请求。如果您查看https://github.com/expressjs/cors 的源代码,大致就是它的作用。

如果您不将这些标头作为响应,浏览器将回退到同源策略。

【讨论】:

以上是关于Express 默认会禁用 CORS 吗?的主要内容,如果未能解决你的问题,请参考以下文章

节点 express REST API 中的 CORS 错误(PATCH 请求)

禁用缓存后,Chrome CORS 请求会更快吗?

你能在 Spring 中完全禁用 CORS 支持吗?

您可以在 Spring 中完全禁用 CORS 支持吗?

无法解决对 Express API 的 AJAX 调用的 CORS 错误

我应该在 Spring 后端禁用 CORS 吗?未经授权的请求被阻止