( Headers 中的错误消息的继续)因此不允许“Origin”http://127.0.0.1:4200“访问 . ”
在使用相同的API时,我无法在两个不同的域上运行相同的Angular 5站点 .
此错误消息来自Chrome . Firefox中的错误是:
跨源请求已阻止:同源策略禁止在http://myapitest.local/v1/subscription/current/products读取远程资源 . (原因:CORS Headers 'Access-Control-Allow-Origin'与'http://127.0.0.1:4200'不匹配)
我在使用白色标签版本的Angular应用程序时注意到这一点,该应用程序将在常规应用程序的备用URL上运行,但仍使用在同一URL上运行的相同Laravel api . 我已经为Laravel添加了适当的CORS配置,这似乎是一个浏览器问题 - 不知道如何解决它 .
我已经在localhost中重新创建了这个,例如从localhost:4200更改为127.0.0.1:4200 .
奇怪的是,使用正确的CORS标头,预检似乎是成功的 .
但是,在GET上,似乎在响应中返回错误的Access-Control-Allow-Origin标头 .
值得注意的是,在API中更改我的允许来源以允许所有('*')不能解决此问题 .
我不确定我能提供哪些其他信息或代码来使其更清晰 . 谢谢 .
6 回答
假设您的api在8080上运行,而您的角度代码在4200上运行 .
在您的角度应用程序中,创建一个名为proxy.conf.json的文件
使用此命令启动angular app
使用此配置,当您调用localhost:4200 / api时,它将调用8080并且它不会有任何CORS错误
您可以为angular webpack developpement服务器提供的请求设置代理 . 通过使用代理,您可以将后端URL更改为源自角度域托管URL . 这将通过您的serve命令或package.json中的 --proxy-config 来实现 . 这样,角度将在具有相同后端服务的不同URls中运行 .
在package.json附近添加一个名为proxy.conf.json的文件 . 从您的请求获取URL添加 /proxy
在您的proxy.conf文件中添加此项
将您的服务命令更改为
ng serve --proxy-config proxy.conf.json --port 4200 --host 0.0.0.0
要么
在你的angular.json中更改服务目标
注意:请确保在Http服务URL和代理配置中添加/ proxy仅用于开发目的
对于 生产环境 环境,您应该在Web服务器中进行配置 .
设置反向代理服务器并为这两个域配置路径 .
Nginx Guide
这将允许您通过http://localhost/访问所有内容
我们假设:
A - > Angular App(localhost:4200)
B - >您的其他域API(myapitest.local)
Example Flow:
因此,在Nginx的帮助下,您将能够从http://localhost/和"B"从http://localhost/访问"A"
由于原点相同,因此不会出现CORS错误 .
问题出在名称映射中 . 由于服务器池可能具有多个IP地址,因此大多数浏览器将IP地址映射到名称 . 这通常通过请求的DNS名称完成 . 在您的情况下,没有名称,因此它正在查找hosts文件中的IP地址(Linux上的/ etc / hosts或Windows上的C:\ Windows \ System32 \ Drivers \ etc \ Hosts)并从那里返回名称 .
由于您需要跨域测试(充当2个单独的服务器),因此在主机文件中添加一行,将myapitest.local指向127.0.0.2 . 一行myapitest2.local到127.0.0.3 . 这将允许您的本地命名匹配IP地址并使用正确的配置(指定要绑定的特定侦听地址,对于每个服务器实例),然后每个服务器实例可以在端口80上运行 .
在所有跨源请求和授权中使用名称 .
Edit
由于
Access-Control-Allow-Credentials: true
,通配符不起作用 .在dev-api.ourdomain.com服务器上:将Response Header添加到路由文件Routes / api.php,为已批准的域构建
Access-Control-Allow-Origin:
标头 . 您也可以将其应用为中间件,但为了简单起见,我将使用简单的路径进行演示 . 这也必须为预检路线完成 .这只是演示概念的示例代码 .
确保在注销时清除HTTP授权和csrf令牌 .
将其添加到
public/index.php
文件中我认为你在文件顶部使用 web.php 这条路线请使用此尝试