403错误大概率由SNI/Host头异常导致签名失效:云存储预签名URL依赖Host头参与计算,Nginx若透传非标准Host(如含端口、IP或变量拼接)会破坏签名;须显式设置proxy_set_header Host为云服务标准域名+端口(如xxx-test.obs.cn-south-1.myhuaweicloud.com:443),禁用Referer等干扰头,并确保与签名生成时Host完全一致。

反向代理到华为 OBS、阿里 OSS 或腾讯 COS 等第三方云存储服务时出现 403,且错误日志中提示 Authentication Failed 或 InvalidSignature,大概率不是权限配置问题,而是 SNI(Server Name Indication)与签名验证不一致导致的——云存储的预签名 URL 依赖 Host 头参与签名计算,而 Nginx 默认透传的 $host 或 $http_host 可能携带端口、IP 或非标准格式,破坏签名有效性。
确认是否为 SNI/Host 导致的签名失败
直接 curl 后端原始地址(带完整预签名参数),验证是否可访问:
- 复制浏览器中报错的完整代理 URL(如
https://your-domain.com/voice/test.mp3?Expires=xxx&OSSAccessKeyId=xxx&Signature=xxx) - 在服务器上执行:
curl -I "https://xxx-test.obs.cn-south-1.myhuaweicloud.com/voice/test.mp3?Expires=xxx&OSSAccessKeyId=xxx&Signature=xxx" - 若直接访问成功(返回 200),但经 Nginx 代理后失败(返回 403),基本锁定是 Host 头传递异常
强制设置正确的 Host 请求头
必须将 proxy_set_header Host 显式设为云存储服务的**标准域名 + 端口(443)**,不能用变量动态拼接:
- 错误写法(会带请求中的 host,可能含端口或 IP):
proxy_set_header Host $http_host; - 正确写法(固定为云存储官方域名):
proxy_set_header Host xxx-test.obs.cn-south-1.myhuaweicloud.com:443; - 若使用 HTTPS 代理,务必补全
:443;HTTP 则用:80 - 该值需与生成预签名 URL 时所用的 Host 完全一致(大小写、端口、有无 www 均需匹配)
禁用可能干扰签名的其他头信息
部分云存储服务对 Referer、User-Agent 或 X-Forwarded-* 等头敏感,建议最小化透传:
- 仅保留必要头:
proxy_set_header Host xxx-test.obs.cn-south-1.myhuaweicloud.com:443;<br>proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-Proto $scheme;
- 注释或删除以下可能触发校验的头:
# proxy_set_header Referer $http_referer;<br># proxy_set_header User-Agent $http_user_agent;<br># proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 避免使用
proxy_pass后带路径(如proxy_pass https://.../voice/),应保持路径原样转发
验证与调试建议
修改后 reload Nginx,并通过日志和响应头交叉验证:
- 开启 Nginx error_log debug 级别(临时):
error_log /var/log/nginx/error.log debug; - 用 curl 检查实际发出的请求头:
curl -v "https://your-domain.com/voice/test.mp3?..." 2>&1 | grep "^> Host:" - 对比直接访问云存储 URL 与代理访问时的 Host 头是否完全一致
- 如仍失败,检查预签名 URL 是否已过期、区域(Region)是否匹配、AK/SK 是否有效


















