如何解决Angular调用PHP IIS接口时的CORS错误及401未授权问题
解决方案
你遇到的CORS报错核心原因是W3C CORS规范的强制限制:当请求携带凭证(withCredentials: true)时,服务端不允许返回Access-Control-Allow-Origin: *通配符,必须指定明确的允许跨域的源地址。你需要按以下步骤调整配置:
第一步:调整PHP服务端CORS配置(必须修改,仅改前端无法解决)
将PHP的CORS头逻辑替换为以下内容,明确指定你Angular应用的实际运行地址,同时补充OPTIONS预检请求的处理逻辑(IIS的Windows身份验证会触发预检请求,预检请求默认不带身份凭证,需要单独处理直接返回200):
<?php // 此处替换为你Angular实际运行的地址,比如本地开发就是http://localhost:4200,生产环境填对应部署域名 $allowedOrigin = 'http://localhost:4200'; header("Access-Control-Allow-Origin: " . $allowedOrigin); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With'); // 直接响应OPTIONS预检请求,不走身份验证逻辑 if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { http_response_code(200); exit; } echo '<pre>'; print_r($_SERVER['REMOTE_USER']);
第二步:Angular端配置优化
你现有代码里的withCredentials: true配置本身是正确的,无需修改。如果需要全局统一配置,避免每个请求单独写参数,可以用HTTP拦截器统一给目标服务的请求加凭证:
拦截器示例代码
// auth.interceptor.ts import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable() export class AuthInterceptor implements HttpInterceptor { intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> { // 仅给目标IIS服务的请求附加凭证 if (request.url.includes('my_server')) { request = request.clone({ withCredentials: true }); } return next.handle(request); } }
在app.module.ts的providers数组中注册拦截器即可全局生效:
providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true } ]
第三步:IIS补充配置(可选,解决预检请求401问题)
如果调整完前后端配置后仍出现401错误,打开IIS对应站点的「身份验证」设置,右键点击「Windows身份验证」→「高级设置」,勾选「启用内核模式身份验证」,同时在「提供程序」列表中保留Negotiate和NTLM两个选项即可。
内容的提问来源于stack exchange,提问作者bob
相关产品推荐
相关产品推荐

