你如何告诉 Angular 发送 Origin header?

How can you tell Angular to send the Origin header?

我有一个 Angular 应用程序连接到我的服务器。出于内部原因,我希望能够将原始域发送到服务器,因为它可以从几个地方访问,例如:

https://domain1.com/app https://domain2.com/app

为此,我希望我的 Angular 应用设置 Origin header。我有一个拦截器,我试图做这样的事情:

return next.handle(req.clone({setHeaders: {Origin: environment.origin}}));

但是,它会抛出一个错误 Refused to set unsafe header "Origin"。我明白为什么,但我如何告诉 Angular 包含此 header 并将其设置为当前域(或按正常方式设置)?我不需要将其设置为任何特殊的内容,我只需要包含它即可。

我认为您应该设置的 header 是 RefererThe usage description header 非常适合您的场景。

您也可以使用完全自定义的 header 来跟踪服务器上的访问模式。

我们无法从前端设置 header 来源,因为技术上禁止从 angular 进行设置。大多数浏览器都遵循 same origin policy,其中不允许 cross-communicate 使用不同的域,只有在允许从服务器访问该域时才会放宽这些限制。

但是 CORS 问题只能通过服务器端解决,方法是将 'Access-Control-Allow-Origin' 设置为您想要启用访问的任何域。使用 Nodejs

的一些例子

const app = express(); app.use(函数(请求、结果、下一个){

// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'https://domain1.com/app');

/
next();

});

Origin header 会自动(由浏览器)发送到 cross-origin Ajax 请求(以及一些其他 cross-origin 请求,例如字体请求或涉及crossorigin 属性)。

它不会针对 same-origin 请求发送,并且您无法发送它,因为它是禁止的 header(因此网站不能谎报来源以绕过 CORS检查)。

由于 为 cross-origin 请求设置的,您可以将其 缺失 视为请求是 同源请求。对此进行测试。


显然,如果请求不是来自浏览器,那么它通常不会有来源 header,但您不能像任何 non-browser 来源一样依赖它来确保安全一个请求很容易伪造 Origin header.