一、Nginx Rewrite规则相关指令有if、rewrite、set、return、break等
1.其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:
rewrite ^/b/(.*)\.html /play.php?video=$1 last; break; 2.如果加上if语句,示例如下: if (!-f $request_filename ) rewrite ^/img/(.*)$ /site/$host/images/$1 last; 二、Nginx与Apache的Rewrite规则实例对比(此处参照https://yq.aliyun.com/articles/44957)简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。例如:
Apache Rewrite 规则: 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] Nginx Rewrite 规则: rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last; rewrite ^/ceshi/$ /zl/ceshi.php last; rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last; rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last; 三、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") { return 403; } 这是等效的,并真实可用的配置 set $flag 0; if ($remote_addr ~ "^(12.34|56.78)") { set $flag "${flag}1"; } if ($http_user_agent ~* "spider") { set $flag "${flag}2"; } if ($flag = "012") { return 403; } 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/51centos-access.log xingcheng; error_log /tmp/51centos-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://yq.aliyun.com/articles/44957 https://www.genban.org/teach/teach-15298.html
http://blog.sina.com.cn/s/blog_7303a1dc0101cm9z.html