internal 指令通过路径身份隔离实现保护,仅响应Nginx内部跳转,外部请求一律404;安全配置需分对外入口(鉴权校验)和对内透传(internal+proxy_pass/alias)两段式结构,禁用正则location、server/http块放置及rewrite redirect等错误用法。

必须用两个分离的 location
不能把 internal 直接放在对外路径上,也不能混在业务逻辑里。典型结构如下:
-
对外入口 location(如
/api/v1/或/download/):接收用户请求,做鉴权、参数校验、签名验证等 -
对内透传 location(如
/_internal/或/_protected/):只含internal;和proxy_pass或alias,不做任何判断
三种可靠触发方式,选一种即可
外部请求要抵达 internal 块,必须经过 Nginx 内部机制跳转,不能靠浏览器重发:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
auth_request:在入口 location 中配置
auth_request /auth;,后端鉴权服务返回 2xx 后,Nginx 自动以子请求方式进入 internal 块 -
rewrite last:在入口 location 中用
rewrite ^/api/(.*)$ /_internal/$1 last;,last触发内部重匹配,命中 internal 块 -
X-Accel-Redirect:后端响应头中返回
X-Accel-Redirect: /_internal/file.pdf,Nginx 自动内部跳转并读取文件
alias 路径必须严格对齐(高频出错点)
如果用 alias 提供静态文件,末尾斜杠必须一致:
- 写
location /_protected/ { internal; alias /data/files/; }→ 请求/_protected/report.pdf映射到/data/files/report.pdf - 若写成
alias /data/files(少斜杠),就会变成/data/filesreport.pdf,路径错乱甚至越界 - 用
root时路径是拼接关系:root /data;+ 请求/_protected/a.pdf→ 实际读/data/_protected/a.pdf,不如alias可控
这些写法一定禁止
- 把
internal;放在server或http块里 → 语法错误或不生效 - 在
internallocation 中配proxy_pass到公网或不可信服务 → 可能被绕过利用 - 用
rewrite redirect(302)代替last→ 浏览器重新发起外部请求,直接打到 internal 路径,立刻 404(说明没走通,不是保护成功) - 把
internal放在正则 location(如location ~ ^/_internal/)里 → 不支持,会被忽略
额外加固建议
internal 解决的是“能不能命中”,不是“该不该放行”。建议叠加:
- 在对外入口 location 中加
auth_request或 Token 校验 - 给鉴权子 location(如
/auth)也加上internal,防绕过直调 - 用
limit_except GET POST { deny all; }限制 HTTP 方法 - 透传真实 IP:
proxy_set_header X-Real-IP $remote_addr;

















