JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

rewrite指令中如何确定使用last或break?

wys521 2024-10-23 15:21:28 精选教程 48 ℃ 0 评论

在日常使用Nginx时会用到rewrite指令;这个指令中的最后一个参数,有下面4个可选值

last
break
redirect
permanent

"redirect(临时重定向 302)"和"permanent(永久重定向 301)" 这两项比较容易理解,但是last和break经常搞混

我们通过实际的操作体验后,就会清晰明白

在Nginx中增加如下的配置

```

# 配置一

location /cms/ {

rewrite "^/cms/a/(.*)" /cms/continue/info last;

rewrite "^/cms/b/(.*)" /cms/continue/info break;

}

location /cms/continue {

return 200 "<html><body>cms continue</body></html>";

}

location /cms/continue/info {

return 200 "<html><body>cms continue info</body></html>";

}

location / {

return 200 "<html><body>Are you ok?</body></html>"

}

```

上面配置表示如果用户请求的url是以 /cms/a 或/cms/b头的都将被rewrite到 /cms/continue/info 这个URL上;只是最后的参数一个是last,另一个是break;

那么有什么不同吗?我们结合实际访问效果来看看


last 验证

当我们在浏览器上使用 /cms/a/1 访问时,可以看到浏览器展示的是“cms continue info”,这表示nginx在完成

rewrite "^/cms/a/(.*)" /cms/continue/info last;

这条rewrite指令后,继续去Servce区块中去匹配locaiton,且也匹配到了"/cms/continue/info" 这条最长的location 匹配

进一步验证,我们将 location /cms/continue/info 删除,修改后的配置如下

# 配置二
location /cms/ {
rewrite "^/cms/a/(.*)" /cms/continue/info last;
rewrite "^/cms/b/(.*)" /cms/continue/info break;
}
location /cms/continue {
return 200 "<html><body>cms continue</body></html>";
}
location / {
return 200 "<html><body>Are you ok?</body></html>"
}

我们再在浏览器上使用 /cms/a/1 访问时,可以看到浏览器展示的是“cms continue ”

再进一步验证,如果我将 /cms/continue 也删除,会发生什么?

修改后的配置如下

# 配置三
location /cms/ {
rewrite "^/cms/a/(.*)" /cms/continue/info last;
rewrite "^/cms/b/(.*)" /cms/continue/info break;
}

location / {
return 200 "<html><body>Are you ok?</body></html>"
}

这个时候会发现浏览器上使用 /cms/a/1 访问时,浏览器显示的是 404 Not Found

last总结

经过上面的实验,我们可以得出以下结论

  1. last会将用户请求重写后,再次进入处理阶段(再次在Server中查找locaion匹配)
  2. 如果找到有与重写后的url相匹配的则采用(如配置一、配置二)
  3. 如果没有找到则不返回404,那怕配置中有一个 "location /"的默认规则(如配置三)

break 验证

我们仍然采用配置一

# 配置一

location /cms/ {
rewrite "^/cms/a/(.*)" /cms/continue/info last;
rewrite "^/cms/b/(.*)" /cms/continue/info break;
}
location /cms/continue {
return 200 "<html><body>cms continue</body></html>";
}
location /cms/continue/info {
return 200 "<html><body>cms continue info</body></html>";
}
location / {
return 200 "<html><body>Are you ok?</body></html>"
}

当我们在浏览器上使用 /cms/b1 访问时,浏览器返回的是 404 Not Found

break结论

所以我们可以得出结论 break 会终止匹配,即不会再匹配后面的规则,也不会再次去查找locaiton匹配

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表