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 请求)