如何在Nginx中配置URL重写
Nginx中URL重写通过rewrite指令实现,包含匹配模式、替换URL及标志(last/break等)。常用于永久重定向、重写到动态脚本或单页应用。需注意正则性能、规则顺序及last与break的区别。修改配置后用nginx-t检查语法,再平滑重载生效。
在Nginx中配置URL重写,其实是日常运维中很常见的需求。说得直白点,就是当用户访问某个URL时,你希望服务器悄悄(或者明确地)把请求转到另一个地址去处理。这事儿听着简单,但细节里全是坑——规则写不对,轻则访问报错,重则整站瘫痪。下面把几个核心场景和配置技巧拆开来说,希望对你有帮助。

1. 基本语法
rewrite指令的结构其实很干净:
rewrite [flag];
三个参数分别对应:要匹配的URL模式、替换后的新URL、以及可选的标志(比如last、break、redirect、permanent)。标志决定了重写完成后,Nginx是继续处理下一个规则,还是直接结束当前流程,或者是给浏览器返回一个301/302跳转。
2. 常见场景示例
示例1:把/oldpage永久重定向到/newpage
server {
listen 80;
server_name example.com;
location / {
rewrite ^/oldpage$ /newpage permanent;
}
}
这里用了permanent,意味着浏览器会收到301状态码,搜索引擎也会把旧页面的权重转移到新地址。访问http://example.com/oldpage,直接跳到/newpage。
示例2:将所有以/category/开头的URL,重写到后端动态脚本
server {
listen 80;
server_name example.com;
location / {
rewrite ^/category/(.*)$ /index.php?category=$1 last;
}
}
比如访问/category/books,$1捕获到books,实际请求变成/index.php?category=books。注意这里用的last标志——它告诉Nginx:这条规则匹配完成后,重新用新的URI去匹配location块。如果你用break,则会停留在当前location块内,不再做第二次location匹配。
示例3:强制所有请求都指向index.html(比如单页应用)
server {
listen 80;
server_name example.com;
location / {
rewrite ^(.*)$ /index.html last;
}
}
不管用户输入什么路径,最终都映射到index.html。这种情况在SPA(单页应用)中很常见,但要注意静态资源(CSS、JS)也需要正确路由,否则容易404。
3. 条件重写:if指令的使用与警告
官方文档其实不太建议在location块里滥用if,因为它的行为有时反直觉。但某些简单场景下,比如只想针对特定请求头或特定URI做重写,用一下也无妨:
server {
listen 80;
server_name example.com;
location / {
if ($request_uri ~* "^/oldpage$") {
rewrite ^/oldpage$ /newpage permanent;
}
}
}
不过说实话,能用正则直接写进rewrite里解决的,尽量别用if。后者在嵌套location时很容易出现预料之外的循环或失效。
4. 几个必须留意的细节
- 性能:复杂的正则表达式会消耗CPU,尤其是高并发下。建议把匹配尽量精确化,避免用“.*”去包罗万象。
- 顺序:
rewrite指令按照在配置文件中间出现的顺序依次执行,先匹配上的先生效。所以如果你有多个规则,记得把更具体的规则放在前面,通用的放后面。 - 标志选择:
last会停止当前rewrite处理,并重新开始一次新请求(会重新匹配location);break则停止当前rewrite处理,但不会重新匹配location,直接执行当前location的内部逻辑。这两个的区别,新手经常搞混。
5. 配置测试与生效
修改完配置文件后,一定要先检查语法:
sudo nginx -t
如果输出类似下面这样,说明配置没问题:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
然后重新加载Nginx,让新配置生效:
sudo systemctl reload nginx
不需要重启,reload是平滑重载,不会中断正在处理的连接。但如果配置文件有语法错误,reload会失败,千万别硬来。
以上就是在Nginx中配置URL重写的常用套路。核心无非就是搞清楚rewrite的匹配规则和标志含义,然后结合实际场景写出正确的路径映射。多动手测试几次,很快就能掌握。


































