Express CORS 子域

Posted

技术标签:

【中文标题】Express CORS 子域【英文标题】:Express CORS subdomain 【发布时间】:2019-11-15 20:29:27 【问题描述】:

我有一个站点 —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 也不起作用?有什么共同的原因吗?

【问题讨论】:

如果站点可以通过https://example.comhttps://www.example.com 访问,那么在你的npm-cors 配置中,你需要明确地允许https://example.comhttps://www.example.com。没有其他方法可以忽略/处理https://www.example.com 你可以为 npm-cors 的“origin”值指定一个像https://(www.)example.com 这样的正则表达式,但是这样做的效果就像你刚刚指定了一个带有显式值的数组一样。最终结果是服务器要么将https://example.com 作为显式值发回,要么将https://www.example.com 发回。浏览器按字面意思处理该值——除非该值是* 通配符。当然,作为指定允许来源的替代方法,您始终可以选择为“来源”配置值指定 * 通配符 好的,那我就明确设置。谢谢! 嗯,明确设置它们不起作用。作为一种解决方法,我刚刚所做的是使用.htaccess 文件(Apache 服务器)中的重写条件从www 域重定向到非www 域。但现在的问题是:即使允许www.example.com,为什么不起作用?我更新了问题 你试过使用正则表达式吗? 【参考方案1】:

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

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


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

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

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

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

【讨论】:

谢谢!通过https://www.example.com 无效。我更新了这个问题,因为它应该,对吧? @Nikita — 应该。问题中没有任何内容可以说明为什么没有。 谢谢!然后我会做一些测试,可能我错过了什么……【参考方案2】:

您需要同时允许这两个域。执行此操作的 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 的值只能是字符串,也可以是您自己实现为函数的自定义逻辑。

【讨论】:

这不等同于使用origin: ["https://example.com", "https://www.example.com"]将域作为数组传递吗? 为此使用函数实在是太过分了

以上是关于Express CORS 子域的主要内容,如果未能解决你的问题,请参考以下文章

Express.js 虚拟主机子域设置

Express 中跨子域的会话

带有 vhost 和 greenlock-express 的 NodeJS 子域

CORS on node subdomain

在 Express 上为子域使用 VHOST

express - nodejs - 如果在子域中,则保留 URL 而不是重定向