nginx中root指令本身不隐藏资源,而是通过明确静态资源根目录、限制非cdn访问、配置强缓存头(如cache-control "public, immutable")及关闭日志与目录浏览,实现源站保护。

在 Nginx 中用 root 指令配合 CDN 加速实现源站保护,关键不是靠 root 本身“隐藏”资源,而是通过它明确、隔离地定义静态资源起点,并结合路径控制、访问限制与缓存策略,让 CDN 成为唯一合法入口,切断用户对源站的直接访问路径。
一、用 root 明确源站资源边界,避免路径泄露
root 应放在 server 块顶层,为整个站点指定统一资源根目录,不依赖 location 拼接逻辑,降低配置歧义:
- 例如:
server_name assets.example.com; root /var/www/cdn-origin;→ 所有请求如/js/app.js都映射到/var/www/cdn-origin/js/app.js - 目录结构需真实存在,且不暴露敏感路径(如不把
/var/www或/etc/nginx设为 root) - 避免在多个 location 中混用不同 root,否则易造成权限混乱或路径越界
二、禁用源站域名直连,强制走 CDN
仅靠 root 不够,必须阻断非 CDN 流量访问源站:
- 在对应 server 块中加判断:检查
$http_x_forwarded_for或$http_user_agent是否为空,或更可靠地——只放行已知 CDN 回源 IP 段(如 Cloudflare ASN、阿里云 CDN 回源段) - 示例限制规则:
if ($remote_addr !~ ^(192\.168\.10\.|203\.205\.144\.) ) { return 444; }(配合 firewall 更稳妥) - 同时配置
server_name为源站专用域名(如origin.example.com),不在公网 DNS 解析,仅供 CDN 回源使用
三、配合 CDN 缓存头,让 root 路径下的资源“不可变”
root 定义了文件在哪,但 CDN 是否缓存、缓多久,取决于响应头。需在对应 location 中设置强缓存策略:
- 针对静态后缀(js/css/png 等)统一加:
add_header Cache-Control "public, immutable, max-age=31536000"; - 搭配
expires 1y;,确保浏览器和 CDN 边缘节点都识别为长期有效 - 避免在该 location 内写
proxy_pass或rewrite,防止覆盖缓存头或触发回源重定向
四、补充防护:关闭日志 + 禁用目录浏览 + 权限最小化
源站保护是系统性动作,root 是起点,不是终点:
- 在静态资源 location 中加
access_log off;,减少 I/O 和日志暴露风险 - 确认
autoindex off;(默认即关),防止用户通过/static/访问看到目录列表 - Nginx 工作进程用户(如
www-data)对root目录仅有读+执行权限(755目录,644文件),不赋予写权限











