安全静态资源管理需根目录(root)专用于主站入口且独立隔离,子路径一律用alias映射防遍历,按/css/、/js/等语义划分虚拟目录并配最小权限与主动防护。

建立安全高效的静态资源根目录与虚拟目录管理规范,关键在于路径语义清晰、映射方式安全、权限边界明确、访问控制分层。不是堆砌指令,而是用对 root 和 alias 的场景、管住系统级读取权限、堵住常见越权入口。
根目录(root)只用于主站入口,且必须独立隔离
主站 HTML 入口统一用 root 配置,路径需独立于系统默认目录,避免混用 /usr/share/nginx/html 或 /var/www/html。推荐做法:
- 为每个站点创建专属目录,如 /var/www/myapp/,并设为 root 值
- 目录属主为部署用户(如 deploy),Nginx 工作进程(www-data 或 nginx)仅需组读权限:目录 755,HTML/CSS/JS 文件 644
- 禁止将配置文件、日志、上传临时目录等敏感路径放在该 root 下;若已存在,用 location 显式拒绝:
location ~ ^/(config|logs|storage)/ { return 403; }
子路径全部用 alias 映射,杜绝路径拼接风险
所有非根路径的静态资源(如 /static/、/images/、/media/)必须使用 alias,不许用 root。这是防跨目录遍历的核心防线:
-
正确写法:
location ^~ /images/ { alias /var/www/assets/images/; }→ 请求 /images/logo.png 直接对应文件系统 /var/www/assets/images/logo.png -
错误写法:
location /images/ { root /var/www; }→ 请求 /images/../etc/passwd 可能解析为 /var/www/images/../etc/passwd,存在穿越漏洞 - alias 值末尾和 location 路径都必须带斜杠,否则路径拼接错位;建议加
^~前缀提升匹配优先级
按资源类型划分虚拟目录,并强制语义约束
企业级静态服务需统一 URL 前缀语义,便于缓存、CDN、日志分析和前端引用。标准清单如下:
- /css/:仅放构建后 .css 文件,禁用 .scss/.less 源码
- /js/:只存打包产物(含 chunk-xxx.js、runtime.js),.map 文件不放此处
-
/images/:下设子目录区分用途,如
/images/icons/、/images/banners/、/images/avatars/ - /fonts/:独立存放 .woff2/.ttf,不混入 /css/
- /media/:音视频资源,建议配合限速与 referer 防盗链
所有路径全小写,禁用中文、空格、下划线或数字开头,避免大小写敏感系统误判或 CDN 缓存分裂。
每类虚拟目录配最小化访问策略
alias 只解决路径映射,还需叠加主动防护层:
- 关闭自动索引:
autoindex off;,防止目录被列出来 - 拦截危险字符:
if ($request_uri ~ "\.\.|//") { return 403; }(放在 location 内) - 限制 HTTP 方法:
if ($request_method !~ ^(GET|HEAD)$) { return 405; } - 兜底校验真实文件存在:
try_files $uri =404;,避免因 URI 解析异常回溯上层目录 - 敏感目录加基础认证:
auth_basic "Internal Area"; auth_basic_user_file /etc/nginx/.htpasswd-internal;


















