You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular 8迁移至9后出现CORS问题,配置代理仍未解决

我之前升级Angular到9的时候也碰到过代理突然“失效”导致CORS的问题,结合你的情况,咱们一步步来排查解决:

1. 先确认代理配置的核心参数是否正确

Angular 9对代理的配置逻辑其实和8差别不大,但有个参数很容易被忽略——changeOrigin。你的proxy.conf.json一定要加上这个选项,否则后端可能会因为Origin不匹配拒绝请求。正确的配置示例应该是:

{
  "/api/*": {
    "target": "http://localhost",
    "secure": false,
    "changeOrigin": true,
    "logLevel": "debug"
  }
}
  • changeOrigin: 这个会让代理服务器转发请求时,把请求头里的Origin改成后端的域名(也就是http://localhost),避免后端的跨域校验拦截
  • logLevel: 开成debug,启动ng serve后你能在控制台看到代理的日志,比如“Proxy created for /api/ to http://localhost”,有这条日志才说明代理真的加载成功了

2. 检查代理配置是否真的被加载

你说已经在angular.json里配置了proxyConfig,但要确认路径是否正确。比如如果你的proxy.conf.jsonsrc文件夹下,配置应该是:

"architect": {
  "serve": {
    "options": {
      "proxyConfig": "src/proxy.conf.json",
      // 其他配置...
    }
  }
}

如果还是不确定,直接用命令行启动强制指定代理:ng serve --proxy-config src/proxy.conf.json,这样能避免angular.json里的配置出错。

3. 前端请求必须用相对路径,不能硬编码后端URL

这是很多人踩的坑:如果你的请求写的是this.http.get('http://localhost/api/users'),那浏览器会直接请求后端,根本不走代理!必须改成相对路径:this.http.get('/api/users'),这样请求会先发给localhost:4200,再由代理转发到http://localhost/api/users,自然就不会有CORS问题。

4. 彻底移除后端的CORS头配置

当你用Angular代理的时候,浏览器和代理服务器是同域的(都是localhost:4200),浏览器根本不会触发CORS校验,所以后端完全不需要返回Access-Control-Allow-Origin头。你之前加了这个头,反而会导致代理转发回来的响应里有这个头,浏览器看到同域请求却有跨域头,就会报错;后来移除又出现问题,大概率是因为前端请求根本没走代理(比如路径写错了),导致直接请求后端,这时候后端没头就会触发CORS错误。

所以一定要把后端web.config里的<add name="Access-Control-Allow-Origin" value="http://localhost:4200" />彻底删掉,确保后端不会返回这个头。

5. 清除缓存,重启服务

Angular 9有时候会缓存旧的配置,试试用ng serve --no-cache启动,同时清除浏览器的缓存(或者用无痕模式打开页面),避免旧的请求缓存干扰。

按照上面的步骤排查下来,应该就能解决你的问题了。

内容的提问来源于stack exchange,提问作者Sam

火山引擎 最新活动