在 nginx 中实现二级目录到根目录的重写,核心做法是在 `server` 或 `location` 块中使用 `rewrite` 指令配合正则表达式,将匹配到的路径重定向至 `/`。具体而言,使用 `^/subdir/(.*)$` 捕获子路径参数,替换为 `/$1`,并添加 `last` 标志以终止当前轮次的查找并重新发起请求,从而完成从二级目录到根目录的映射。

如何配置 rewrite 规则以实现永久重定向
若需实现浏览器地址栏 URL 改变的永久重定向(301),应使用 `redirect` 或 `permanent` 标志替代 `last`。这适用于希望搜索引擎收录根目录而非旧二级目录的场景。配置时,Nginx 会立即向客户端返回 301 状态码及新位置,客户端随后发起对根目录的新请求。

server {
listen 80;
server_name example.com;
# 二级目录到根目录的永久重定向
location /old-dir/ {
rewrite ^/old-dir/(.*)$ /$1 permanent;
}
}
上述配置中,当访问 /old-dir/page.html 时,Nginx 匹配正则 ^/old-dir/(.*)$,捕获组 为 page.html,最终重写为 /page.html。由于使用了 permanent 标志,Nginx 返回 301 Moved Permanently,浏览器地址栏更新为 http://example.com/page.html。此方法确保旧链接被彻底替换,且不会在服务器端进行内部跳转。
如何在 location 块中处理带查询参数的重写
当二级目录下的请求包含查询参数(如 ?id=123)时,Nginx 默认会将原始查询字符串附加到重写后的 URI 上。若需保留这些参数,无需额外配置;若需丢弃或修改参数,则需在重写规则中显式处理。通常,直接重写路径即可保留参数,因为 rewrite 指令默认追加原始 args。

server {
listen 80;
server_name example.com;
# 保留查询参数的内部重定向
location /app/ {
rewrite ^/app/(.*)$ /$1 last;
}
}
在此配置中,访问 /app/search?q=test 会触发正则匹配,捕获 $1 为 search,重写为 /search。由于未指定标志,默认行为是继续循环查找,但此处因使用 last,Nginx 会重新在 location 块中匹配 /search。若 /search 无专门 location,则落入默认处理。重要的是,查询参数 ?q=test 会自动附加到新 URI,最终请求变为 /search?q=test。若需丢弃参数,可重写为 /$1? (注意末尾空格),强制清空查询字符串。
基于程序中某个输入、条件或结果的具体问题
当二级目录路径中包含特殊字符或嵌套层级过深时,正则表达式 ^/subdir/(.*)$ 中的 (.*) 可能匹配到空字符串或导致意外行为。例如,访问 /subdir/(尾部斜杠)时,$1 为空,重写结果为 /,符合预期;但若访问 /subdir(无尾部斜杠),正则不匹配,请求将继续按原路径处理,可能导致 404。因此,需确保正则能覆盖所有变体,或在 location 定义时统一处理尾部斜杠。


















