Node Express 服务器中的 CORS 正则表达式

Posted

技术标签:

【中文标题】Node Express 服务器中的 CORS 正则表达式【英文标题】:CORS Regex in Node Express Server 【发布时间】:2018-08-20 18:11:08 【问题描述】:

我正在创建一个express 服务器。这是sn-p。

const app = express();
app.use(cookieParser()); // mainly used to retrieve and store CSSO tokens
app.use(bodyParser.json());

app.use(function(req, res, next) 
    res.header("Access-Control-Allow-Origin", "https://the.real.url.com:8081");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header("Access-Control-Expose-Headers", "Content-Disposition, Content-Type");
    res.header("Access-Control-Allow-Credentials", true);
    next();
);

目前正在运行。但我需要用regex 替换https://the.real.url.com:8081。 首先,它可以是https 或只是http。 其次,可能有也可能没有端口。等等。

所以当我编辑它时https?://the.real.url.com:8081 允许httphttps

我收到此错误 The 'Access-Control-Allow-Origin' header contains the invalid value 'https?://the.real.url.com:8081'. Origin 'https://the.real.url.com:8081' is therefore not allowed access.

我还尝试了http(s?)://the.real.url.com:8081https?://* 和其他变体。它们都不起作用。

所以我想知道Regex 是不允许的吗?但是通配符* 有效。

我做错了吗?

【问题讨论】:

【参考方案1】:

您是否查看过快递的 cors 包:https://github.com/expressjs/cors,这允许您使用正则表达式作为来源:

var express = require('express');
var cors = require('cors');
var app = express();

var corsOptions = 
  origin: /example\.com$/,
  methods: "GET,HEAD,PUT,PATCH,POST,DELETE"
;

app.use(cors(corsOptions));

您还可以在单​​个端点上使用此包,例如

app.get('/test/', cors(corsOptions), function (req, res, next) 
    res.json(msg: 'Success');
);

【讨论】:

我做到了。在我阅读的一篇文章(或另一个 *** 答案)中,它说如果我按照我在 sn-p 中所做的方式进行操作,则不需要使用它。这就是为什么我没有使用它。我猜我错了。 好吧,我希望它能让你走得更远! 这是否适用于subdomain.example.com 不是 100% 确定,我希望 subdomain.example.com 应该可以工作,但您需要对其进行测试。如有必要,更改正则表达式很容易。【参考方案2】:

Access-Control-Allow-Origin 标头可以是:

* 允许来自任何地方 以/为路径的特定网址

你不能把正则表达式放在那里。


可以将正则表达式应用于 request 中的 Origin 标头,如果匹配,则将 Origin 请求标头中的值复制到Access-Control-Allow-Origin 响应头。

var origin = req.get("Origin");
if (origin && origin.match(your_regex)) 
    res.header("Access-Control-Allow-Origin", origin);


或者你可以只使用has a configuration option for this situation的CORS中间件。

【讨论】:

我认为应该是req.get("origin"),至少对于快速/连接服务器而言。

以上是关于Node Express 服务器中的 CORS 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

React/Node/Express 和 google OAuth 的 CORS/CORB 问题

使用我的 node/express rest api 服务器获取数据时 CORS 被阻止

Node.js---使用Express写接口

node跨域cors模块,nodejs+express跨域

在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误

使用 cors、express 和 google api 的 Node.js 服务器应用程序在 Azure 部署后无法正常工作