nginx 应作为反向代理+缓存网关代理 oss,而非重定向到 cdn 域名;否则会绕过防盗链、压缩、tls 终止等控制,引发安全与性能风险。

直接在 Nginx 中“重定向”静态资源请求到对象存储 CDN 域名(比如 cdn.example.com)并不是最佳实践,也容易引发循环、缓存错乱或安全风险。真正安全、可控的做法是:**用 Nginx 作为反向代理 + 缓存网关,而非 301/302 跳转**。跳转会让浏览器直接连 OSS 或 CDN,失去 Nginx 的防盗链、压缩、TLS 终止、缓存策略等关键控制能力。
为什么不该用 rewrite 重定向到 CDN 域名
用户访问 https://example.com/js/app.js,若 Nginx 用 return 302 https://cdn.example.com/js/app.js 跳转:
- 浏览器拿到跳转响应后,会**直接向 CDN 域名发起新请求**,绕过 Nginx —— 你再也无法控制 Referer 验证、Token 签名、响应压缩或缓存头;
- CDN 若未配置防盗链,OSS 公网 Endpoint 可能被恶意爬取或刷流量;
- 若 CDN 缓存未命中,回源请求将暴露原始 OSS 域名或 IP,可能被探测或攻击;
- HTTP/2 多路复用、连接复用等优化失效,TTFB 反而升高。
正确做法:反向代理 + 缓存 + 安全收敛
让 Nginx 作为统一入口,内部代理到 OSS,同时注入安全头、控制缓存、校验来源:
- 配置
upstream指向 OSS 内网或公网 Endpoint(推荐使用内网 Endpoint,如阿里云同地域 VPC 内的myapp.oss-cn-hangzhou-internal.aliyuncs.com,更安全且免带宽费); - 用
proxy_pass转发请求,不暴露 OSS 域名给客户端; - 添加
proxy_set_header Host和proxy_set_header Authorization(如需签名回源); - 通过
valid_referers+if ($invalid_referer)拦截非法 Referer; - 对图片、JS、CSS 等路径启用
proxy_cache,设置Cache-Control和Expires响应头。
关键配置片段(以阿里云 OSS 为例)
在 http 块中定义缓存区:
在 server 块中配置代理逻辑:
proxy_cache oss_cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_pass https://myapp.oss-cn-hangzhou.aliyuncs.com;
proxy_set_header Host myapp.oss-cn-hangzhou.aliyuncs.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 防盗链
valid_referers *.example.com example.com;
if ($invalid_referer) { return 403; }
# 强制缓存头
add_header Cache-Control "public, max-age=3600, stale-while-revalidate=86400";
}
如果必须对外暴露 CDN 域名(如 SEO 或第三方引用场景)
可在特定路径下做条件跳转,但需严格约束:
- 仅对已知静态路径(如
/assets/)且来源可信(如特定 User-Agent 或内网 IP)才允许 302; - 跳转目标必须是已绑定 CNAME 的加速域名(如
cdn.example.com),且该域名已在 CDN 控制台配置了 Referer 白名单、Token 鉴权或私有 Bucket 回源; - 务必关闭该路径下的 Nginx 缓存与日志,避免跳转被缓存导致不可控行为。
示例(慎用):
location ^~ /assets/ {if ($http_referer ~* ^(https?://(www\.)?example\.com)|^$) {
return 302 https://cdn.example.com$request_uri;
}
return 403;
}
本质上,安全不是靠跳出去,而是把控制权留在自己手里。Nginx 代理 OSS 不是妥协,而是把 CDN 的能力收编进你的基础设施里。











