Express CORS子域

时间:2019-07-05 08:11:00

标签: javascript node.js express cors

我有一个站点-https://example.com-对该API进行了调用-https://api.example.com-。该API用Express编写,并使用CORS package来允许来自网站的请求:

app.use(
    cors({
        credentials: true,
        origin: "https://example.com",
    })
);

可以通过https://example.comhttps://www.example.com访问该站点。如您所见,在API中,显式允许来自前者地址的请求,但不允许来自后者的请求。因此,如果有人通过后一个地址访问它,则对该API的请求将被拒绝。

通常的解决方法是什么?明确允许同时使用https://example.comhttps://www.example.com吗?或者也许有一种方法可以忽略子域www

谢谢!

-

编辑:

按照建议,我将https://www.example.com明确添加到cors配置

app.use(
    cors({
        credentials: true,
        origin: ["https://example.com", "https://www.example.com"],
    })
);

但这没用。解决方法是,我将.htaccess文件(Apache服务器)中的重写条件从www域重定向到非www域。

但是现在的问题是:为什么甚至允许www.example.com都不起作用?有什么共同的原因吗?

2 个答案:

答案 0 :(得分:0)

通常的方法是避免两个不同来源的网站具有相同的内容。

配置www.example.com发出HTTP 301重定向到example.com


  

明确允许https://example.comhttps://www.example.com吗?

那也可以。 origin可以传递一个数组。

  

或者也许有一种方法可以忽略子域名www?

origin也可以传递正则表达式。

答案 1 :(得分:-1)

您需要同时允许两个域。用于执行此操作的API有点复杂。基本上,您需要阅读documentation of the CORS package

app.use(
    cors({
        credentials: true,
        origin: function (origin callback) {
            switch (origin) {
                case "https://example.com":
                case "https://www.example.com":
                    callback(null, true); // allow these domains
                    break;
                default:
                    callback(new Error('Now allowed')); // block others
            }
        },
    })
);

origin的值只能是字符串或实现为函数的您自己的自定义逻辑。