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

NestJS Swagger仅支持HTTPS且VPN下无法加载问题求助

解决方案:Swagger HTTP访问及VPN加载问题处理

针对你在Windows Server + PM2 + NestJS环境下遇到的Swagger异常,以下是针对性的修复步骤:


问题1:Swagger仅支持HTTPS访问,HTTP无法打开

核心原因

默认启用的helmet()会设置严格的内容安全策略(CSP),拦截Swagger UI依赖的CDN资源(如cdn.jsdelivr.net的样式/脚本),导致HTTP环境下页面无法加载。同时strictTransportSecurity头可能强制跳转HTTPS。

修复代码

修改main.ts中的Helmet配置,放宽CSP策略并关闭强制HTTPS:

app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      // 允许Swagger UI的CDN资源和内联样式
      styleSrc: ["'self'", "'unsafe-inline'", "https://cdn.jsdelivr.net"],
      // 允许Swagger UI的脚本执行需求
      scriptSrc: ["'self'", "'unsafe-inline'", "'unsafe-eval'", "https://cdn.jsdelivr.net"],
      imgSrc: ["'self'", "data:"],
    },
  },
  // 关闭强制HTTPS跳转,适配HTTP访问场景
  strictTransportSecurity: false,
}));

问题2:VPN环境下Swagger无法加载,其他接口正常

原因1:CORS配置未覆盖VPN客户端

VPN访问时的客户端Origin不在CORS_ORIGIN允许列表中,导致Swagger UI的AJAX请求被拦截。

修复方式

临时放宽CORS配置测试(生产环境需替换为具体域名/IP段):

app.enableCors({
  origin: '*', // 测试用,生产建议指定VPN客户端的IP或域名
  credentials: true,
});

原因2:Swagger文档未配置VPN可访问的服务器地址

Swagger UI默认使用当前访问的协议/地址请求接口,VPN环境下可能解析错误。

修复方式

在Swagger配置中添加VPN可访问的服务器地址:

const swaggerConfig = new DocumentBuilder()
  .setTitle('Logo Api')
  .setDescription('TCS Logo Api Documentation')
  .setVersion('1.0.0')
  // 添加HTTP/HTTPS及VPN专用访问地址
  .addServer(`http://${configService.get('SERVER_HOST')}:${configService.get('PORT')}`)
  .addServer(`https://${configService.get('SERVER_HOST')}:${configService.get('HTTPS_PORT') || 443}`)
  .addServer(`http://${configService.get('VPN_SERVER_HOST')}:${configService.get('PORT')}`)
  .addBearerAuth(
    { 
      description: `Please enter token in following format: Bearer <JWT>`,
      name: 'Authorization',
      bearerFormat: 'Bearer',
      scheme: 'Bearer',
      type: 'http',
      in: 'Header'
    },
    'access-token',
  )
  .build()

需在配置文件中补充SERVER_HOST(服务器内网/公网IP)、VPN_SERVER_HOST(VPN访问时的服务器地址)。

原因3:防火墙或PM2进程未生效

  • 检查Windows Server防火墙,确保应用端口允许VPN客户端IP访问;
  • 重启PM2应用使配置生效:
pm2 restart <你的应用名称>

额外排查步骤

  1. 用Postman测试VPN环境下的http://<VPN_SERVER_IP>:<PORT>/api/json,若能返回Swagger JSON文档,说明是UI资源加载问题;若无法返回,检查路由是否被拦截。
  2. 打开浏览器F12控制台,查看VPN访问时的具体错误(CORS/404/资源加载失败),精准定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:50:12