nginx的Rewrite指令详解

介绍

# 指令语法:
rewrite regex replacement [flag];
关键字   正则    替代内容    flag标记

# 默认值:none
# 应用位置:server、location、if

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:

rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
# 在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,
# regex部分是^/(.*),这是一个正则表达式,匹配所有,
# 匹配成功后跳转到http://www.etiantian.org/$1,这里的$1是取前面regex部分()里的内容,
# 结尾permanent;表示永久301重定向标记,
# 即跳转到后面的http://www.etiantian.org/$1地址上。

flag标记说明

  1. last:
    • 执行本条 rewrite 后,终止当前 location 内的后续 rewrite/return
    • 内部 URI 重写:基于重写后的 URI,在当前 server 块内重新匹配所有 location,最终由匹配到的 location 处理请求。
    • 外部 URL(完整 URL,如 http://example.com/xxx):Nginx 返回 302 临时重定向 给客户端,浏览器向新地址发起请求。
  2. break:
    • 执行本条 rewrite 后,终止当前 location 内所有 rewrite/return,
    • 不会重新匹配任何 location,直接在当前 location 块继续执行后续非 rewrite 指令(如 proxy_pass、root 等)。
    • 外部 URL:同样返回 302 临时重定向 给客户端,浏览器向新地址发起请求。
  3. redirect: 返回 302 临时重定向,客户端会向新地址重新发起请求,浏览器地址栏显示跳转后的 URL。可用于外部跳转或内部 URI 跳转。
  4. permanent: 返回 301 永久重定向,客户端会缓存跳转关系,后续请求直接访问新地址,浏览器地址栏显示跳转后的 URL。可用于外部跳转或内部 URI 跳转。

测试实践

# 实现访问http://blog.etiantian.org跳转到http://www.etiantian.org/blog/zqf.html。
# 外部跳转时使用这种方法,浏览器地址会变为跳转后的地址,另外,要事先设置http://www.etiantian.org/blog/zqf.html 有结果输出,不然会出现401等权限错误。

# 跳转前http://blog.etiantian.org对应站点的配置如下:
cat /etc/nginx/conf.d/blog.etiantian.org.conf
server {
        listen       80;
        server_name  blog.etiantian.org;
        if ( $http_host ~* "^(.*).etiantian.org$") {
           set $domain $1;
           rewrite ^(.*) http://www.etiantian.org/$domain/zqf.html break;
          }
}

# 跳转后http://www.etiantian.org/blog/zqf.html地址对应的站点配置如下:
cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
    listen 80;
    server_name www.etiantian.org;
    root /data/www;
    location / {
        index index.html;
    }
}

mkdir /data/www/blog
echo "I am zqf" >/data/www/blog/zqf.html

nginx -t
nginx -s reload


curl http://blog.etiantian.org -L
I am zqf
posted @ 2025-08-14 23:47  阿峰博客站  阅读(14)  评论(0)    收藏  举报