Javascript 快速CORS子域
我有一个网站-Javascript 快速CORS子域,javascript,node.js,express,cors,Javascript,Node.js,Express,Cors,我有一个网站-https://example.com-调用API的调用-https://api.example.com-。API是用Express编写的,它用于允许来自站点的请求: app.use( cors({ credentials: true, origin: "https://example.com", }) ); 可通过https://example.com或通过https://www.example.com。如您所见,在API中,我显
https://example.com
-调用API的调用-https://api.example.com
-。API是用Express编写的,它用于允许来自站点的请求:
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
都不起作用?有什么共同的原因吗?通常的方法是避免两个网站的来源不同,内容相同
配置www.example.com
向example.com
发出HTTP 301重定向
显式允许两个
https://example.com
和https://www.example.com
那也行<代码>原点可以传递一个数组
或者有一种方法可以忽略子域www
origin
还可以传递一个正则表达式。您需要同时允许这两个域。执行此操作的API有点复杂。基本上,您需要阅读以下内容:
origin
的值只能是字符串或作为函数实现的自定义逻辑。如果站点可以在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
。浏览器会逐字处理该值,除非该值是*
通配符。当然,除了指定允许的原点之外,您还可以选择为'origin'配置值指定通配符,然后我将显式设置它们。谢谢嗯,明确地设置它们不起作用。作为一种解决方法,我刚才做的是在.htaccess
文件-Apache服务器中使用重写条件从www
域重定向到非www
域。但现在的问题是:即使允许www.example.com
,为什么不起作用?我更新了问题,你试过使用正则表达式吗?谢谢!通过<代码>https://www.example.com不起作用。我更新了问题,因为它应该,对吗?@Nikita-应该。问题中没有什么可以说明为什么没有。谢谢!然后我会做一些测试,可能我遗漏了一些东西……这不就是将域作为一个带有origin:[”的数组传递吗https://example.com", "https://www.example.com“]
?使用函数来实现这一点是非常过分的
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
}
},
})
);