最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 基础配置中 rewrite 重写规则如何编写
时间:2026-08-13 12:37:49 编辑:袖梨 来源:一聚教程网
Nginx rewrite规则本质是用正则匹配请求URI并改写路径,必须置于server或location块内,按顺序执行,依赖标志位(last/break/redirect/permanent)控制流程与匹配行为。
Nginx 的 rewrite 规则本质是用正则匹配请求 URI,再按规则跳转或改写路径。它不复杂,但容易因匹配顺序、标志位或上下文位置出错。
rewrite 写在哪?位置很关键
rewrite 必须放在 server 或 location 块里,不能直接写在 http 块顶层。不同位置行为不同:
- 写在
server块中:对所有进入该虚拟主机的请求,在 location 匹配前统一处理 - 写在
location块中:只对匹配到该 location 的请求生效,且重写后会重新进行 location 匹配(除非加last) - 避免在
if块里滥用 rewrite(Nginx 最新不推荐),尤其不要在 if 中做非变量判断(如if ($request_uri ~* ...))
基本语法和常用标志位
格式为:rewrite 正则 替换串 标志;
-
正则:匹配
$request_uri(不含域名和参数,含开头斜杠),建议用^/old/(.*)$这类锚定写法,避免误匹配 -
替换串:可引用捕获组(
$1,$2),也可拼接新路径,如/new/$1 -
标志位:
-
last:重写后停止当前 location 处理,用新 URI 重新匹配 location(常用) -
break:重写后不再匹配其他 rewrite,也不重新 location 查找(适合内部路径改写) -
redirect:返回 302 临时跳转(加https://或完整 URL 才生效) -
permanent:返回 301 永久跳转
-
常见实用场景写法
例如把 /article/123 改成 /post?id=123:
rewrite ^/article/(d+)$ /post?id=$1? last;
注意结尾的 ? 可清空原始 query string,避免变成 /post?id=123?old=param
- 去掉路径末尾斜杠:
rewrite ^(.*[^/])/$ $1 permanent; - 强制 HTTPS 跳转:
rewrite ^(.*)$ https://$host$1 permanent;(需配合if ($scheme != "https")使用,但更推荐用return 301) - 隐藏 .php 扩展名:
rewrite ^/(.*).php$ /$1 last;,再配合try_files $uri.php $uri =404;
调试和避坑提示
rewrite 不生效?先检查这几项:
- 确认正则是否真正匹配(可用在线 regex 工具测试,注意 Nginx 默认 PCRE,
^和$锚定整个 URI) - 查看 error log,开启
error_log /path/to/log warn;,rewrite 失败或循环会报rewrite or internal redirection cycle - 多个 rewrite 按书写顺序执行,前面的可能影响后面的匹配,必要时用
break截断 - 静态文件路径重写后,确保后续 location 能正确命中(比如重写成
/static/xxx.png,就得有对应location /static/)