<article class=“article fmt article-content”><p>原文网址:Nginx系列–rewrite的应用_IT利刃出鞘的博客-CSDN博客</p><h2>简介</h2><p>本文介绍Nginx中rewrite的应用。</p><p>分享Java技术星球(自学精灵):learn.skyofit.com</p><h2>语法</h2><p>rewrite regex URL [flag];</p><p><strong>flag标记位</strong></p><ul><li>last:进行解决rewrite,并对配更改后的 URI 从新进行搜寻(再从 server 走一遍匹配流程)。此时对于以后 server 或 location 上下文,不再解决 rewrite 指令。</li><li>break:进行解决rewrite</li></ul><p><!—-></p><ul><li>last 和 break 的区别:last 重写 url 后,会再从 server 走一遍匹配流程,而 break 终止重写后的匹配</li><li>last 和 break 的相同点:<strong>都能进行解决,前面的 rewrite 指令不会再执行。</strong></li></ul><p><!—-></p><ul><li>redirect:返回蕴含 302 代码的长期重定向,在替换字符串不以"http://",“https://“或”$scheme"结尾时应用.</li><li>permanent:返回蕴含 301 代码的永恒重定向。</li></ul><p><!—-></p><ul><li>permanent 是永恒重定向,浏览器会记住它,会始终重定向你设置的地址。能够通过革除浏览器缓存解决。</li></ul><p>rewrite 指令只能返回代码 301 或 302。要返回其余代码,须要在 rewrite 指令前面蕴含 return 指令。</p><h2>查看rewrite日志</h2><p>关上日志开关:rewrite_log on; 能够配置到http,server,location和if上下文中。</p><p><strong>示例</strong></p><p>配置:nginx.conf</p><pre><code>location /first { rewrite_log on; rewrite /first(.) /second$1 last;}</code></pre><p>拜访</p><pre><code>curl test1.com:8080/first/2.txt</code></pre><p>日志后果 </p><p></p><h2>示例:break和last</h2><h3>break</h3><p><strong>配置</strong></p><pre><code>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”; }}</code></pre><p><strong>拜访</strong></p><pre><code>http://localhost:9000</code></pre><p><strong>后果</strong></p><p>重定向到了baidu.com</p><p><strong>剖析</strong></p><p>首先,匹配到 /break 的 location 块,执行了 rewrite 和 proxy_pass,跳过 return(因为有 break),重定向到 http://127.0.0.1:9000/info;而后,再次进行 server 块,匹配到 /info 的 location 块,最初重定向到了baidu。</p><h3>last</h3><p><strong>配置</strong></p><pre><code>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”; }}</code></pre><p><strong>拜访</strong></p><pre><code>http://localhost:9000</code></pre><p><strong>后果</strong></p><p>重定向到了baidu.com</p><p><strong>剖析</strong></p><p>首先,匹配到 /break 的 location 块,执行了 rewrite,跳过 return 和 proxy_pass(因为有 last,proxy_pass 须要和 break 一起用);而后持续匹配,匹配到 /info 的 location 块,最初重定向到了baidu。</p><h2>示例:在location的外部和内部</h2><h2>break和last在location内部</h2><p><strong>根底示例</strong></p><pre><code>server{ listen 80; server_name test.com; root /data/wwwroot/test.com; rewrite /1.html /2.html; rewrite /2.html /3.html;}</code></pre><p>拜访:test.com/1.html</p><p>后果:浏览器最终重定向到test.com/3.html</p><p>剖析:申请1.html文件时,会被重定向到2.html,而后被重定向到3.html,最初返回的文件为3.html</p><p><strong>例1:rewrite后增加break</strong></p><pre><code>server{ listen 80; server_name test.com; root /data/wwwroot/test.com; rewrite /1.html /2.html break; rewrite /2.html /3.html;}</code></pre><p>拜访:test.com/1.html</p><p>后果:浏览器最终重定向到test.com/2.html</p><p>剖析:申请1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。</p><p><strong>例2:break后还有location</strong></p><pre><code>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; }}</code></pre><p>拜访:test.com/1.html</p><p>后果:浏览器最终重定向到test.com/2.html</p><p>剖析:申请1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。</p><h2>break和last在location外部</h2><p><strong>根底示例</strong></p><pre><code>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; }}</code></pre><p><strong>拜访:test.com/1.html</strong></p><p>后果:浏览器最终重定向到test.com/b.html</p><p>剖析:申请1.html,会通过两次重定向到3.html,3.html又刚好匹配location /3.html{},所以返回b.html。</p><p><strong>拜访:test.com/2.html</strong></p><p>后果:浏览器最终重定向到test.com/a.html</p><p>剖析:申请2.html,会通过两次重定向到2.html,2.html又刚好匹配location /2.html{},所以返回a.html。</p><p><strong>例1:rewrite后增加break</strong></p><pre><code>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; }}</code></pre><p>拜访:test.com/1.html</p><p>后果:浏览器最终重定向到test.com/2.html</p><p>剖析:申请1.html文件时,会被重定向到2.html,遇到break,以后location{} 以及前面的location{} 的指令都不再执行。</p><p><strong>例2:break后还有location</strong></p><pre><code>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; }}</code></pre><p>拜访:test.com/1.html</p><p>后果:浏览器最终重定向到test.com/a.html</p><p>剖析:申请1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。2.html会再去匹配一次location,匹配到了location /2.html,于是返回了test.com/a.html。</p></article>