Angular16+IIS10环境下PUT请求403禁止问题排查求助
问题描述
我有一个基于Angular 16的网站,部署在IIS 10(HTTPS 443端口,配置SSL证书),已启用ARR(应用程序请求路由)并设置URL重写规则。后端为Node.js服务,运行在同一服务器3000端口,同样配置HTTPS和SSL证书。
调用后端POST方法完全正常,但调用PUT方法时请求从未到达后端(后端server.js日志中间件未打印任何请求日志)。Chrome控制台提示“PUT 完整路径 403 (Forbidden)”,但POSTMAN调用同一PUT接口正常。
相关代码
后端server.js日志中间件代码
app.use((req, res, next) => { console.log(`Ruta recibida: ${req.url}`); next(); });
Angular服务代码
InactivarUsuario( usuario: Usuario, token: string ): Observable<HttpResponse<any>> { const url = `${configGlobal.urlApiTerrenos}usuarios/actualizaestadovigenciausuario`; const headers = new HttpHeaders({ Authorization: `Bearer ${token}`, // 在请求头中添加Bearer令牌授权 }); return this.http.put<any>( url, { usuario }, { headers, observe: 'response' } ); }
Angular组件代码
if (this.token) { this.usuarioService .InactivarUsuario(usuario, this.token) .pipe( catchError((error: HttpErrorResponse) => { if (error.status === 0) { this.messageConfirmationModal = '网络问题,请联系IT人员'; } return of(null); }) ) .subscribe((data) => { if (data && data.status === 200) { if (usuario.vigencia === 'A') { this.toastr.success('用户已成功激活。'); // 显示提示消息 } else { this.toastr.success('用户已成功禁用。'); // 显示提示消息 } this.buscarUsuarios(); } }); }
排查与解决方法
1. 移除IIS的WebDAV模块
IIS默认启用的WebDAV模块会拦截PUT、DELETE等请求,直接返回403禁止访问:
- 打开IIS管理器,找到目标Angular站点,进入模块功能
- 找到
WebDAVModule,右键选择移除 - 重启站点后测试PUT请求
2. 更新URL重写规则
确保ARR的重写规则允许PUT方法:
- 进入站点的URL重写功能,查看现有规则
- 在规则的条件中添加HTTP方法校验,确保包含PUT,示例配置:
<rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{REQUEST_METHOD}" pattern="^(GET|POST|PUT|DELETE)$" /> </conditions> <action type="Rewrite" url="https://localhost:3000/{R:1}" /> </rule>
3. 调整后端CORS配置
PUT请求可能触发OPTIONS预检,需确保后端CORS规则允许PUT方法及对应请求头:
const cors = require('cors'); app.use(cors({ origin: 'https://你的Angular站点域名', methods: ['GET', 'POST', 'PUT', 'DELETE'], allowedHeaders: ['Authorization', 'Content-Type'] }));
4. 对比请求内容差异
在Chrome开发者工具的网络标签,查看Angular发送的PUT请求的请求头、请求体,和Postman的请求做对比:
- 确认Authorization头格式是否正确(Bearer+空格+令牌)
- 检查请求体结构是否和Postman一致
- 排查是否有Angular自动添加的额外请求头导致拦截
5. 检查IIS请求过滤规则
确认IIS允许PUT方法:
- 进入站点的请求过滤功能,切换到HTTP方法标签
- 若PUT未在列表中,点击允许添加该方法
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

