nginx通过auth_request将静态资源访问交由业务系统实时鉴权,配合internal location隔离私有文件路径,并用map脱敏日志中的敏感参数,实现轻量、可靠、合规的权限控制闭环。

在 Nginx 中为静态资源实现基于用户的权限验证,核心不是让 Nginx 自己管理用户,而是把它变成一个轻量、可靠、可审计的“守门人”:它把访问请求先交给业务系统校验身份与权限,再根据结果放行或拦截,同时确保日志不泄露敏感信息。整个过程无需修改后端逻辑,也不依赖前端跳转改造。
用 auth_request 做实时身份与权限校验
这是最标准、最可控的方式。Nginx 将每个静态资源请求(比如 /static/img/abc.jpg)暂停,转发到你自己的鉴权接口(如 /auth-check),由业务系统判断当前用户是否有权访问该资源。
- 在 location 块中添加
auth_request /auth; - 配置内部鉴权 location:
location = /auth {<br> internal;<br> proxy_pass http://backend/auth-check;<br> proxy_set_header X-Original-URI $request_uri;<br> proxy_set_header Cookie $http_cookie;<br>} - 后端接口需返回 200 表示允许,401/403 表示拒绝;必须设为
internal,防止被绕过直接调用 - 支持从 Cookie、Header 或 URL 参数提取 token,配合 JWT、Session 或自定义签名校验均可
区分资源敏感等级,用 internal + alias 隔离私有文件
对身份证照、合同 PDF 等真正敏感的文件,不能只靠“链接不公开”,而要从路径层面切断直接访问可能。
- 把私有文件存放在 Web 根目录之外(例如
/data/private/) - 配置
location /private/ { internal; alias /data/private/; } - 前端仍可通过
/private/contract.pdf请求,但外部无法直连/data/private/路径 - 配合 auth_request 使用,实现“先验权、再取文件”的闭环
审计日志必须脱敏,避免合规风险
权限通过后,记录谁、何时、访问了什么,是审计刚需;但原始 URL 可能含手机号、UID、token,直接记入日志违反等保和 GDPR。
- 用
map指令从$request_uri提取并掩码敏感字段,例如:map $request_uri $masked_phone { ~(? - 定义专用日志格式,只引用脱敏变量:
log_format secure_static '$remote_addr [$time_local] "$request" $status "$masked_phone" "$http_user_agent"'; - 仅在静态资源 location 中启用:
location ~* \.(js|css|png|pdf)$ { access_log /var/log/nginx/static_audit.log secure_static; }
权限验证要和系统用户权限协同落地
Nginx 进程(通常是 www-data)能否读取文件,取决于操作系统级权限。即使鉴权通过,若文件不可读,仍会返回 403。
- 确认 worker 进程实际运行用户:
ps aux | grep nginx,worker 应为 www-data(或 nginx) - 静态目录逐级设置执行权(x):上级路径如
/var/www、/var/www/example.com都需对 www-data 有 x 权限 - 文件权限建议 640,目录权限建议 750;上传目录额外加组写(
chmod g+w),但禁用 PHP 解析 - 用
sudo -u www-data ls -l /path和cat实时验证读取能力,别只看页面是否打开











