Angular 应用程序无法从 Cloudflare 背后启用 CORS 的站点获取数据

Posted

技术标签:

【中文标题】Angular 应用程序无法从 Cloudflare 背后启用 CORS 的站点获取数据【英文标题】:Angular application can't get data from CORS-enabled site behind Cloudfare 【发布时间】:2021-12-15 16:10:21 【问题描述】:

我在从 Angular 访问启用 CORS 的网站时遇到问题。通过浏览器从端点获取 JSON 数据是没有问题的,但是从 Angular 获取它是不可能的。总是显示问题:

从源“http://localhost:4200”访问“***”处的 XMLHttpRequest 已被 CORS 策略阻止:没有“访问控制允许来源” 请求的资源上存在标头。

这是我的服务:

export class GetService 
  private url = '***'
  headers = new HttpHeaders( 'Access-Control-Allow-Origin': '*' );

  constructor(private http: HttpClient)  

  getList(): Observable<List[]> 
    return this.http.get<List[]>(this.url + 'list/',  headers: this.headers );
  

我已经试过了:

如上所示将标头 Access-Control-Allow-Origin 设置为 *(我也尝试过不使用标头) 检查其他标头设置(主机、用户代理等) built-in proxy

还是什么都没有。使用内置代理我得到其他错误:

请启用 cookie。 错误 1003 射线 ID:*** • 2021-10-31 15:54:16 UTC 不允许直接 IP 访问 发生了什么? 您已请求一个属于 Cloudflare 网络的 IP 地址。必须提供有效的 Host 标头才能到达所需的网站。 我能做些什么? 如果您有兴趣了解有关 Cloudflare 的更多信息,请访问我们的网站。 Cloudflare Ray ID:*** • 您的 IP:*** • Cloudflare 的性能和安全性

我仍然可以通过直接向浏览器键入端点地址来获取数据,所以我假设我必须以某种方式欺骗端点,浏览器正在连接到它,而不是 Angular 应用程序。我能做什么?

【问题讨论】:

你的后端是什么?弹簧靴还是什么? 我不知道 - 我刚刚得到了端点地址 始终应从服务器端启用 cors 【参考方案1】:

您没有在客户端(角度)上设置“Access-Control-Allow-Origin”:“*”,而是在服务器上设置。

如果您可以控制服务器,请将其添加到您的服务器。

如果您无法控制服务器,请创建一个angular proxy configuration。

需要在所有环境的所有 Web 服务器上重复此代理配置。

【讨论】:

我做了一个角度代理配置,我尝试了重写路径的方式,现在它看起来像这样: "/api/*": "target": "www.** *", "secure": false, "logLevel": "debug", "changeOrigin": true, "pathRewrite": "^/api/list": "/product/list", "^/api/formats" : "/product/formats", "^/api/papers": "/product/papers" ,所以当我进入 localhost:4200/api/list 它显示来自端点的输出没有任何错误 - 它应该是。待续…… 但主要问题是,当我想通过服务获取数据时,出现错误“在 'www.***/product/list' 处访问 XMLHttpRequest(重定向自 '@987654324 @) from origin 'localhost:4200' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。” 您有没有,例如,在本地运行的 node.js 后端快速服务器?如果是这样,它在本地主机上运行什么端口?您向哪个 URL 发出 HTTP 请求?代理背后的想法是您将请求转发到后端服务器,然后后端服务器可以向任何东西发出请求,因为后端服务器不受 CORS 的约束 老实说,我想您可以代理到任何域并跳过拥有自己的 BE 服务器 - 我真正需要知道能够提供帮助的是..... (1) 什么域和您的应用程序在端口上运行吗?本地主机:4200 我假设? (2) 您向哪个 URL 发出 HTTP 请求? 我无权访问服务器。它是像 www.emp****oto.pl 这样的公共领域(我不想在这里放完整地址)。所以后端不在本地,我的前端 Angular 应用程序(启用了代理)在 localhost:4200 上。仍然很有趣,为什么我可以通过浏览器访问该端点,但不能从 Angular 服务访问。

以上是关于Angular 应用程序无法从 Cloudflare 背后启用 CORS 的站点获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Angular jqxSchedular源localData无法从远程绑定

从 Angular 向 nodejs 发送 https 请求。无法发送任何数据

Angular 5 - 无法从一个组件导航到另一个组件

Angular CLI 生成的库 - 无法从它的模块导入组件

无法从 Kubernetes 集群上的 Angular pod 向服务发出 GET 请求

无法为输入类型文件添加 jquery 类