当前位置 主页 > 服务器问题 > nginx问题汇总 >

    Nginx Rewrite规则与使用介绍和技巧实例

    栏目:nginx问题汇总 时间:2018-11-27 16:28

    这篇文章主要介绍了Nginx Rewrite规则与使用介绍和技巧实例,本文讲解了正则表达式匹配、文件及目录匹配、flag标记、Nginx Rewrite相关指令等内容,需要的朋友可以参考下

    一.正则表达式匹配,其中:

    * ~ 为区分大小写匹配
    * ~* 为不区分大小写匹配
    * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

    二.文件及目录匹配,其中:

    * -f和!-f用来判断是否存在文件
    * -d和!-d用来判断是否存在目录
    * -e和!-e用来判断是否存在文件或目录
    * -x和!-x用来判断文件是否可执行

    三.rewrite指令的最后一项参数为flag标记,flag标记有:

    1.last 相当于apache里面的[L]标记,表示rewrite。
    2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
    3.redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
    4.permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。

    使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{……}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。
    例如:如果我们将类似URL/photo/123456 重定向到/path/to/photo/12/1234/123456.png

    复制代码 代码如下:
    rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photo/$1/$1$2/$1$2$3.png ;

    四.NginxRewrite 规则相关指令

    1.break指令

    使用环境:server,location,if;
    该指令的作用是完成当前的规则集,不再处理rewrite指令。

    2.if指令

    使用环境:server,location
    该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。

    3.return指令

    语法:returncode ;
    使用环境:server,location,if;
    该指令用于结束规则的执行并返回状态码给客户端。
    示例:如果访问的URL以”.sh”或”.bash”结尾,则返回403状态码
    复制代码 代码如下:
    location ~ .*\.(sh|bash)?$
    {
    return 403;
    }

    4.rewrite 指令

    语法:rewriteregex replacement flag
    使用环境:server,location,if
    该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,示例如下:
    复制代码 代码如下:
    if( $host ~* www\.(.*) )
    {
    set $host_without_www $1;
    rewrite ^(.*)$  http://$host_without_www$1permanent;
    }

    5.Set指令

    语法:setvariable value ; 默认值:none; 使用环境:server,location,if;
    该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。
    示例:set$varname “hello world”;

    6.Uninitialized_variable_warn指令

    语法:uninitialized_variable_warnon|off
    使用环境:http,server,location,if
    该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。

    五.Nginx的Rewrite规则编写实例

    1.当访问的文件和目录不存在时,重定向到某个php文件
    复制代码 代码如下:
    if( !-e $request_filename )