发布于2026-07-06 阅读(0)
扫一扫,手机访问
在Nginx中配置URL重写,其实是日常运维中很常见的需求。说得直白点,就是当用户访问某个URL时,你希望服务器悄悄(或者明确地)把请求转到另一个地址去处理。这事儿听着简单,但细节里全是坑——规则写不对,轻则访问报错,重则整站瘫痪。下面把几个核心场景和配置技巧拆开来说,希望对你有帮助。

rewrite指令的结构其实很干净:
rewrite [flag];
三个参数分别对应:要匹配的URL模式、替换后的新URL、以及可选的标志(比如last、break、redirect、permanent)。标志决定了重写完成后,Nginx是继续处理下一个规则,还是直接结束当前流程,或者是给浏览器返回一个301/302跳转。
/oldpage永久重定向到/newpageserver {
listen 80;
server_name example.com;
location / {
rewrite ^/oldpage$ /newpage permanent;
}
}
这里用了permanent,意味着浏览器会收到301状态码,搜索引擎也会把旧页面的权重转移到新地址。访问http://example.com/oldpage,直接跳到/newpage。
/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匹配。
index.html(比如单页应用)server {
listen 80;
server_name example.com;
location / {
rewrite ^(.*)$ /index.html last;
}
}
不管用户输入什么路径,最终都映射到index.html。这种情况在SPA(单页应用)中很常见,但要注意静态资源(CSS、JS)也需要正确路由,否则容易404。
if指令的使用与警告官方文档其实不太建议在location块里滥用if,因为它的行为有时反直觉。但某些简单场景下,比如只想针对特定请求头或特定URI做重写,用一下也无妨:
server {
listen 80;
server_name example.com;
location / {
if ($request_uri ~* "^/oldpage$") {
rewrite ^/oldpage$ /newpage permanent;
}
}
}
不过说实话,能用正则直接写进rewrite里解决的,尽量别用if。后者在嵌套location时很容易出现预料之外的循环或失效。
rewrite指令按照在配置文件中间出现的顺序依次执行,先匹配上的先生效。所以如果你有多个规则,记得把更具体的规则放在前面,通用的放后面。last会停止当前rewrite处理,并重新开始一次新请求(会重新匹配location);break则停止当前rewrite处理,但不会重新匹配location,直接执行当前location的内部逻辑。这两个的区别,新手经常搞混。修改完配置文件后,一定要先检查语法:
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的匹配规则和标志含义,然后结合实际场景写出正确的路径映射。多动手测试几次,很快就能掌握。
上一篇:dmesg日志中的安全相关问题
下一篇:怎样用Nginx配置压缩传输
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8