一、NginxRewrite规则相关指令有if、rewrite、set、return、break等
1.其中rewrite是最关键的指令。一个简单的NginxRewrite规则语法如下:
rewrite^/b/(.*)\.html/play.php?video=$1last;
break;
2.如果加上if语句,示例如下:
if(!-f$request_filename)
rewrite^/img/(.*)$/site/$host/images/$1last;
二、Nginx与Apache的Rewrite规则实例对比
简单的Nginx和Apache重写规则区别不大,基本上能够完全兼容。例如:
ApacheRewrite规则:
RewriteRule^/(mianshi|xianjing)/$/zl/index.php?name=$1[L]
RewriteRule^/ceshi/$/zl/ceshi.php[L]
RewriteRule^/(mianshi)_([a-zA-Z]+)/$/zl/index.php?name=$1_$2[L]
RewriteRule^/pingce([0-9]*)/$/zl/pingce.php?id=$1[L]
NginxRewrite规则:
rewrite^/(mianshi|xianjing)/$/zl/index.php?name=$1last;
rewrite^/ceshi/$/zl/ceshi.phplast;
rewrite^/(mianshi)_([a-zA-Z]+)/$/zl/index.php?name=$1_$2last;
rewrite^/pingce([0-9]*)/$/zl/pingce.php?id=$1last;
三、NGINX实现IF语句里的AND,OR多重判断
1.nginx的配置中不支持if条件的逻辑与/逻辑或运算,并且不支持if的嵌套语法,我们可以用变量的方式来实现:
具体方法为AND就用变量叠加,OR就用0或1切换。
1)首先是伪代码(即不被nginx支持)写在这里只是为了方便理解:
if($remote_addr~"^(12.34|56.78)"&&$http_user_agent~*"spider"){
return403;
}
这是等效的,并真实可用的配置
set$flag0;
if($remote_addr~"^(12.34|56.78)"){
set$flag"${flag}1";
}
if($http_user_agent~*"spider"){
set$flag"${flag}2";
}
if($flag="012"){
return403;
}
2)服务器真实生效的配置
location/{
if($request_filename~^(.+)/(.+)$){
set$l2$1;
}
set$ll$request_filename;
if(!-e$request_filename){
set$l3"3";
}
if(!-e$l2){
set$l4"1$l3";
}
if($l4=13){
rewrite^(.*)$https://www.baidu.com;
}
access_log/tmp/pythotab-access.logxingcheng;
error_log/tmp/pythotab-error.log;
}
释义:
a.$request_filename为被请求文件的路径,$request_filename~^(.+)/(.+)$为被请求文件的上级目录信息。可以将$l2定义在日志格式中,通过日志查看输出是否成功。
b.通过set$l4"1$l3",实际上就代替了逻辑与运算。
四、nginx的rewrite规则参考
-~为区分大小写匹配
-~*为不区分大小写匹配
-!~和!~*分别为区分大小写不匹配及不区分大小写不匹
--f和!-f用来判断是否存在文件
--d和!-d用来判断是否存在目录
--e和!-e用来判断是否存在文件或目录
--x和!-x用来判断文件是否可执行
-last相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
-break终止匹配,不再匹配后面的规则
-redirect返回302临时重定向地址栏会显示跳转后的地址
-permanent返回301永久重定向地址栏会显示跳转后的地址
-$args
-$content_length
-$content_type
-$document_root
-$document_uri
-$host
-$http_user_agent
-$http_cookie
-$limit_rate
-$request_body_file
-$request_method
-$remote_addr
-$remote_port
-$remote_user
-$request_filename
-$request_uri
-$query_string
-$scheme
-$server_protocol
-$server_addr
-$server_name
-$server_port
-$uri
作者:扣丁学堂
链接:https://www.jianshu.com/p/8e90266ba77e