乐趣区

关于java:Nginx系列rewrite的使用

原文网址:​​Nginx 系列 –rewrite 的应用_IT 利刃出鞘的博客 -CSDN 博客​​

简介

本文介绍 Nginx 中 rewrite 的应用。

分享 Java 技术星球(自学精灵):​​learn.skyofit.com​​

语法

rewrite regex URL [flag];

flag 标记位

  • last:进行解决 rewrite,并对配更改后的 URI 从新进行搜寻(再从 server 走一遍匹配流程)。此时对于以后 server 或 location 上下文,不再解决 rewrite 指令。
  • break:进行解决 rewrite

<!—->

  • last 和 break 的区别:last 重写 url 后,会再从 server 走一遍匹配流程,而 break 终止重写后的匹配
  • last 和 break 的相同点: 都能进行解决,前面的 rewrite 指令不会再执行。

<!—->

  • redirect:返回蕴含 302 代码的长期重定向,在替换字符串不以 ”http://”,”https://“或”$scheme” 结尾时应用.
  • permanent:返回蕴含 301 代码的永恒重定向。

<!—->

  • permanent 是永恒重定向,浏览器会记住它,会始终重定向你设置的地址。能够通过革除浏览器缓存解决。

rewrite 指令只能返回代码 301 或 302。要返回其余代码,须要在 rewrite 指令前面蕴含 return 指令。

查看 rewrite 日志

关上日志开关:rewrite_log on; 能够配置到 http,server,location 和 if 上下文中。

示例

配置:nginx.conf

location /first {
    rewrite_log on;
    rewrite /first(.*) /second$1 last;
}

拜访

curl test1.com:8080/first/2.txt

日志后果 

示例:break 和 last

break

配置

server {
        listen 9000;
        server_name localhost;
 
        location /info {rewrite ^/.* https://www.baidu.com permanent;}
 
        location /break {
                rewrite /.* /info break;
                proxy_pass http://127.0.0.1:9000;
 
                # 该 return 不执行
                return 200 "ok";
        }
}

拜访

http://localhost:9000

后果

重定向到了 baidu.com

剖析

首先,匹配到 /break 的 location 块,执行了 rewrite 和 proxy_pass,跳过 return(因为有 break),重定向到 http://127.0.0.1:9000/info;而后,再次进行 server 块,匹配到 /info 的 location 块,最初重定向到了 baidu。

last

配置

server {
        listen 9000;
        server_name localhost;
 
        location /info {rewrite ^/.* https://www.baidu.com permanent;}
 
        location /break {
                rewrite /.* /info last;
 
                # 该 proxy_pass 不执行
                proxy_pass http://127.0.0.1:9000;
 
                # 该 return 不执行
                return 200 "ok";
        }
}

拜访

http://localhost:9000

后果

重定向到了 baidu.com

剖析

首先,匹配到 /break 的 location 块,执行了 rewrite,跳过 return 和 proxy_pass(因为有 last,proxy_pass 须要和 break 一起用);而后持续匹配,匹配到 /info 的 location 块,最初重定向到了 baidu。

示例:在 location 的外部和内部

break 和 last 在 location 内部

根底示例

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
 
    rewrite /1.html /2.html;
    rewrite /2.html /3.html;
}

拜访:test.com/1.html

后果:浏览器最终重定向到 test.com/3.html

剖析:申请 1.html 文件时,会被重定向到 2.html,而后被重定向到 3.html,最初返回的文件为 3.html

例 1:rewrite 后增加 break

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
 
    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
}

拜访:test.com/1.html

后果:浏览器最终重定向到 test.com/2.html

剖析:申请 1.html 文件时,会被重定向到 2.html,遇到 break,不再执行下边的 rewrite。

例 2:break 后还有 location

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
 
    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
    location /2.html {return 403;}
}

拜访:test.com/1.html

后果:浏览器最终重定向到 test.com/2.html

剖析:申请 1.html 文件时,会被重定向到 2.html,遇到 break,不再执行下边的 rewrite。

break 和 last 在 location 外部

根底示例

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html;
        rewrite /2.html /3.html;
    }
    location /2.html {rewrite /2.html /a.html;}
    location /3.html {rewrite /3.html /b.html;}
}

拜访:test.com/1.html

后果:浏览器最终重定向到 test.com/b.html

剖析:申请 1.html,会通过两次重定向到 3.html,3.html 又刚好匹配 location /3.html{},所以返回 b.html。

拜访:test.com/2.html

后果:浏览器最终重定向到 test.com/a.html

剖析:申请 2.html,会通过两次重定向到 2.html,2.html 又刚好匹配 location /2.html{},所以返回 a.html。

例 1:rewrite 后增加 break

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html break;
        rewrite /2.html /3.html;
    }
    location /2.html {rewrite /2.html /a.html;}
    location /3.html {rewrite /3.html /b.html;}
}

拜访:test.com/1.html

后果:浏览器最终重定向到 test.com/2.html

剖析:申请 1.html 文件时,会被重定向到 2.html,遇到 break,以后 location{} 以及前面的 location{} 的指令都不再执行。

例 2:break 后还有 location

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html last;
        rewrite /2.html /3.html;
    }
    location /2.html {rewrite /2.html /a.html;}
    location /3.html {rewrite /3.html /b.html;}
}

拜访:test.com/1.html

后果:浏览器最终重定向到 test.com/a.html

剖析:申请 1.html 文件时,会被重定向到 2.html,遇到 break,不再执行下边的 rewrite。2.html 会再去匹配一次 location,匹配到了 location /2.html,于是返回了 test.com/a.html。

退出移动版