break和last是nginx的rewrite_module里的指令,tengine翻译的文档里对这两个的指令解释是:
last
停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location;
break
停止执行当前这一轮的ngx_http_rewrite_module指令集;
就我所知,这两个指令都可以用来实现内部重定向(internal redirect),我经常有疑问,这两个指令具体的区别是什么呢?昨天总算弄清楚了一点,请往下看:
我定义了一个虚拟主机 "nigel.zeng.me" :
server {
listen 80 default_server;
server_name nigel.zeng.me;
root www;
access_log logs/nigel.log main;
location /foo/ {
rewrite ^/foo/(.*) /test/$1 break;
echo "break keyword";
}
location /bar/ {
rewrite ^/bar/(.*) /test/$1 last;
echo "last keyword";
}
location /test/ {
valid_referers none server_names ~nigel\.zeng\.me;
if ($invalid_referer) {
return 403;
}
}
}
里面定义了的两个location,第一个用来处理 http://nigel.zeng.me/foo/*** 的情况,使用break来做内部重定向,把http://nigel.zeng.me/foo/*** 重写为 http://nigel.zeng.me/test/***;
第二个location用来处理http://nigel.zeng.me/bar/*** 的情况,使用last来做内部重定向,也是重定向到http://nigel.zeng.me/test/***。
echo指令是agentzh所编写的echo-nginx-module第三方模块里带的。
这里准备的两个url是 http://nigel.zeng.me/foo/index.html 和 http://nigel.zeng.me/bar/index.html。
内部重定向后的页面 http://nigel.zeng.me/test/index.html 如下:
按照tengine的中文文档里介绍的,break指令会停止去匹配新的location,而last指令则会去查找匹配改变后URI的新location,那么按照上面的配置,访问第一个URL “http://nigel.zeng.me/foo/index.html“ 会返回 "break keyword" 字段,而访问 ”http://nigel.zeng.me/bar/index.html“ 则会返回 http://nigel.zeng.me/test/index.html 的结果。
OK,看看测试结果:
访问第一个URL “http://nigel.zeng.me/foo/index.html“:
访问第二个URL ”http://nigel.zeng.me/bar/index.html“:
所以从测试结果可以得出以下结论:
1、rewrite后接break指令,完成rewrite之后会执行完当前的location(或者是if)指令里的其他内容(停止执行当前这一轮的ngx_http_rewrite_module指令集),然后不进行新URL的重新匹配。
2、rewrite后接last指令,在完成rewrite之后停止执行当前这一轮的ngx_http_rewrite_module指令集已经后续的指令,进而为新的URL寻找location匹配。
结果仅供参考。
-----EOF------
have fun.
-- nigelzeng
- 大小: 32.8 KB
- 大小: 15.3 KB
- 大小: 28.6 KB
分享到:
相关推荐
在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是...2、使用proxy_pass指定源:使用last和break都可以 3、使用alias指定
总的来说,配置Nginx的rewrite规则是提升Web应用性能和用户体验的关键步骤,需要理解正则表达式和Nginx的配置语法,才能正确有效地实现URL重写。在LNMP环境中,根据实际的部署类型选择合适的配置文件,并确保规则的...
Nginx允许在`server`和`location`上下文中使用`if`条件判断,常见的条件包括正则表达式匹配、文件和目录的存在性检测等。 例如,针对特定用户代理(如IE浏览器)执行重定向: ```nginx if ($http_user_agent ~ ...
替换后的URI可以附加`flag`标志来决定接下来的动作,如`last`、`break`、`redirect`和`permanent`。 **2. 重写规则标志** - **last**:停止处理重写模块指令,根据新的URI匹配新的location。 - **break**:结束...
Nginx 作为一款高性能的 HTTP 和反向代理服务器,提供了丰富的功能支持来实现这一目标。 #### 1. 伪静态技术概述 伪静态是指将动态页面(如 PHP 页面)通过 URL 重写规则转换为静态页面形式的过程,但实际访问时...
规则可以基于正则表达式,结合`break`、`last`、`redirect`和`permanent`等标志来控制重写的逻辑。 6. **HTTP缓存机制** Nginx可以通过缓存经常访问的HTTP响应,减少对后端服务器的压力。`proxy_cache`和`proxy_...
理解正则表达式和`break`、`last`、`redirect`、`permanent`等规则结束标记。 4. **SSL/TLS安全配置**:随着HTTPS的普及,配置Nginx支持SSL是必备技能。了解如何生成和配置SSL证书,以及启用HTTP/2协议提升性能。 ...
通过以上配置和测试,Nginx可以有效地帮助解决跨域问题,使前端能够顺利地与不同源的后端服务进行通信。在实际项目中,可能还需要考虑其他安全措施,如配置CORS(Cross-Origin Resource Sharing)头,允许特定的跨域...
总结来说,Nginx 作为一个多功能的Web服务器和反向代理,提供了广泛的功能和灵活性,适合搭建高性能、高可用性的Web环境。通过深入理解和实践这些操作手册中的知识点,可以更好地管理和优化 Nginx 服务。
- `flag`: 可选标志,如`last`, `break`, `redirect`, `permanent`等。 例如,一个简单的重写规则可能看起来像这样: ```nginx rewrite ^/old/(.*)$ /new/$1 permanent; ``` 这条规则将所有以`/old/`开头的URL...
Nginx是一款高性能的HTTP和反向代理服务器,广泛用于网站的负载均衡和内容分发。在Nginx中,Rewrite模块是实现URL重写的重要工具,它允许我们根据预定义的规则对请求的URL进行转换,从而实现动态URL到静态URL的映射...
rewrite指令支持多种标记,如last、break等,用于控制重写规则的行为。 **5.2 正则表达式匹配** 使用正则表达式来匹配URL,并基于匹配结果执行相应的重写动作。 **5.3 文件及目录匹配** 可以针对特定的文件或目录...
与Apache的`mod_rewrite`模块相比,Nginx的`rewrite`规则在语法和工作方式上有所不同,这使得理解并熟练掌握Nginx的`rewrite`规则成为提升服务器配置能力的关键。 **1. Nginx与Apache的Rewrite规则对比** Apache的...
`rewrite`指令结合`break`、`last`、`redirect`等控制符,实现灵活的URL转换逻辑。 八、访问控制与限速 Nginx支持基于IP地址、地理位置、HTTP头部等多种条件的访问控制,可以限制特定IP的访问,或者设置速率限制...
break; } } ``` 这段代码会让Nginx将所有未找到的静态资源请求转发到`index.php`,通过ThinkPHP的URL路由机制处理。 4. **加载配置**:保存`demo.conf`后,执行`nginx -t`检查配置文件是否有错误,无误后用`...
- `rewrite`指令允许我们修改请求的URL,可以结合`break`、`last`、`redirect`、`permanent`等标志来控制流程。 - `break`:结束当前的`rewrite`规则链。 - `last`:跳出`rewrite`规则链,执行匹配到的`location`...