Swagger UI调用GET重定向接口出现CORS错误 Postman和浏览器访问正常
问题根因
你遇到的CORS错误不是你的Lambda接口返回的CORS配置有问题,而是Swagger UI通过XHR/fetch方式发送请求后,接口返回3xx重定向到google.com,浏览器会自动对重定向后的目标地址发起同请求模式的访问,而google.com的CORS策略没有允许Swagger UI的源(你本地/部署的Swagger域名)访问,所以触发了跨域拦截。
Postman和直接浏览器地址栏访问没问题是因为这两种场景发起的是普通导航请求,不受CORS策略限制。
解决方案
方案1:修改Swagger接口定义,标记为重定向响应
你当前的swagger.yml里定义的响应都是返回JSON结构,没有正确声明3xx重定向响应,修改你的swagger.yml配置:
/{shortUrl}: get: tags: - 'Redirection' summary: 'Redirect short URL -> Original' description: 'This route redirects user to original URL website when a get is sent to trimified URL' produces: - 'text/plain; charset=utf-8' parameters: - name: 'shortUrl' in: 'path' description: 'ID of short URL' required: true type: 'string' responses: '302': description: 'Redirect to target URL' headers: Location: type: string description: Target redirect URL '400': description: 'Invalid URL' schema: $ref: '#/responseDefinitions/UserErrorResponse' '500': description: 'Internal Server Error' schema: $ref: '#/responseDefinitions/ServerErrorResponse'
修改后调试时不要直接点「Execute」,可以复制接口地址到新标签页打开,避免Swagger用XHR模式请求重定向接口。
方案2:Lambda返回跳转HTML替代3xx重定向(兼容Swagger内调试)
如果你需要保留Swagger内调试可用,可以修改Lambda的返回逻辑,当检测到请求来源是Swagger UI时,返回包含自动跳转脚本的HTML页面,而非直接返回3xx重定向:
// app.js 示例逻辑 app.get('/:shortUrl', (req, res) => { const targetUrl = getTargetUrl(req.params.shortUrl) // 你的原有逻辑获取重定向地址 // 通过Referer头判断是否是Swagger UI发起的请求 const isSwaggerRequest = req.headers.referer?.includes('swagger') if (isSwaggerRequest) { res.send(` <html> <script>window.location.href = "${targetUrl}"</script> </html> `) return } // 保留原有正常重定向逻辑 res.redirect(targetUrl) })
方案3:配置Swagger UI关闭自动跟随重定向
在Swagger UI的初始化配置中添加requestInterceptor,修改fetch请求的redirect属性为manual,这样浏览器不会自动跟随重定向,你可以在响应头里拿到Location地址手动访问:
// Swagger UI 初始化配置 const ui = SwaggerUIBundle({ // 其他原有配置保持不变 requestInterceptor: (req) => { req.redirect = 'manual' return req } })
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

