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.com
或https://www.example.com
访问该站点。如您所见,在 API 中明确允许来自前一个地址的请求,但不允许来自后者的请求。因此,如果有人通过后一个地址访问它,对 API 的请求将被拒绝。
解决这个问题的常用方法是什么?明确允许https://example.com
和https://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.com
和https://www.example.com
访问,那么在你的npm-cors 配置中,你需要明确地允许https://example.com
和https://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.com
和https://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 子域的主要内容,如果未能解决你的问题,请参考以下文章