【问题标题】:CORS Regex in Node Express ServerNode Express 服务器中的 CORS 正则表达式
【发布时间】: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 是不允许的吗?但是通配符* 有效。

我做错了吗?

【问题讨论】:

    标签: node.js regex express cors


    【解决方案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'});
    });
    

    【讨论】:

    • 我做到了。在我阅读的一篇文章(或另一个 StackOverflow 答案)中,它说如果我按照我在 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"),至少对于快速/连接服务器而言。
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多