Nginx 用 rewrite 隐藏动态后端 URL 的核心是切断外部直接访问真实路径,通过 internal + alias 构建仅内部跳转通道,配合 rewrite 映射友好 URL、deny all 拦截 .php 直连,并支持重写前鉴权。

Nginx 用 rewrite 隐藏动态后端 URL,核心不是“只改地址”,而是切断外部对真实路径的访问能力,同时把用户看到的简洁 URL 安全地映射到内部处理逻辑。关键在于配合 internal、alias、路径隔离和响应头控制,而非单纯做字符串替换。
用 internal + alias 构建“仅内部可跳转”通道
真实 PHP 文件(如 /api/user.php)绝不能被直接请求。配置如下:
- 在 server 块中定义一个专供内部跳转的 location:
location /api/ {<br> internal;<br> alias /var/www/html/api/;<br>}
-
internal表示该 location 只接受 Nginx 内部 rewrite 跳转,拒绝所有外部 HTTP 请求(返回 404) -
alias必须用,不能用root;否则 rewrite 后的路径拼接会出错 - 用户访问
/user/profile/123是合法的,但直接访问/api/user.php?id=123会被拦截
用 rewrite 规则对外暴露友好路径
把用户可见的伪静态 URL 映射为内部跳转指令:
location ~ ^/user/profile/(\d+)$ {<br> rewrite ^/user/profile/(\d+)$ /api/user.php?id=$1 last;<br>}location ~ ^/post/detail/(\d+)$ {<br> rewrite ^/post/detail/(\d+)$ /api/post.php?id=$1 last;<br>}
注意:last 会触发 Nginx 重新匹配 location,此时命中上面的 /api/ 区块,并因 internal 判定为合法内部请求——整个过程浏览器地址栏不变,用户无感知。
加一层兜底防护:禁止所有 .php 直连
防止遗漏路径或绕过 rewrite 规则:
location ~ \.php$ {<br> deny all;<br>}- 这条规则放在所有 rewrite 之后,确保任何以
.php结尾的外部请求都被拒掉 - 例外路径(如入口文件
index.php)需单独放行,用更精确的 location 匹配
进阶:跳转前统一校验权限
若需在映射前检查登录态或 Token,避免无效请求打到后端:
- 用
if+error_page替代裸 rewrite:
location ~ ^/(user|post)/ {<br> if ($http_authorization = "") { return 401; }<br> # 或检查 cookie、token 等<br> rewrite ^/user/profile/(\d+)$ /api/user.php?id=$1 last;<br>}
这样可在重写前完成鉴权,失败直接返回错误,不进入后端处理流程。


















