You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:03:16