今天把nginx站点配置重新复习下, 做下笔记.
首先从网上看到说localtion 指令是 ngx_http_core_module模块提供的指令, 而且是nginx跟后端服务沟通的桥梁(比如php-fpm), 而rewrite 则是 ngx_http_rewrite_module 提供的指令,同样的还有 if. nginx 处理这两个规则的流程是:
- 进行rewrite规则匹配,根据命中规则改写localtion.
- 如果没有被其他指令中断并退出,则进入localtion匹配.
- 执行匹配成功的localtion区块中的指令.
比如这样一个配置:
server {
listen 80;
server_name www.wx.com;
root /Users/zhangchao/www/weixin;
index index.php;
# 把abc.html 映射到 index.php
rewrite /abc.html /index.php;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
rewrite规则还有第三个flag参数:可以是redirect, permanent, break, last等等.
redirect, permanent 这两个flag是进行重定向(302临时, 301永久), 重定向以后的url也会显示在地址栏, nginx处理这两个是会中断流程, 通过http请求告诉用户端进行重定向, 也就是这次请求不需要进过后端服务,由nginx全职负责.
# 把abc.html 重定向 success2.html
rewrite /abc.html /success2.html permanent;
break 和 last :
这两个flag都会中断当前的rewrite流程, 不再继续匹配后续的rewrite指令. 如果是在 server的顶级部分, 两者的作用相同, 跳过剩下的rewrite指令,进入localtion匹配. 如果rewrite是在server区块顶级if内部, 和直接放在server下级的rewrite行为是一致的.
server {
# 此时两者作用一致
rewrite /error1.html /error.html break;
rewrite /error2.html /error.html last;
# 把 /abc.html?name="success2" 映射到success2.html
if ( $arg_name = "success2" ) {
rewrite /abc.html /success2.html break;
}
两者的区别在于当rewrite指令存在于localtion区块时, last跳出localtion块, 重新进行localtion匹配; 而break跳过localtion下的后续rewrite规则, 执行其他指令.
location /error2.html {
rewrite /error2.html /error2.html break; # 跳过后续的rewrite规则, 能正常显示error2.html
}
location /success2.html {
rewrite /success2.html /success2.html last; # 重新进行localtion匹配, 无限循环, 服务器会出错 500
}
所有一般情况下, 使用break指令会相对安全, 不会造成循环重定向.
看的博客地址 这里