nginx重写模块 ngx_http_rewrite_module

2018-07-18 15:43:11

ngx_http_rewrite_module 模块是用来重写 uri的。

Syntax:	break;
Default: —
Context: server, location, if

停止当前重写指令集的处理,如果当前在 location 内,那么接下来的处理会继续在此 location里。

Syntax:	if (condition) { ... }
Default: —
Context: server, location

condition 可以为下列:

1.变量,如果变量为空字符串或者0,false。
2.可以通过 = 或者 != 操作符来比较。
3.可以为正则,~(大小写敏感),~*(大小写不敏感)。也可以取反 !~,!~*。可以捕获以供后面通过 $1 - $9来获取。如果正则里面包含 } 或 ; 字符,那么需要用单或者双引号括起来。
4.检测文件是否存在 -f,!-f。
5.目录是否存在 -d,!-d。
6.检测文件,目录或者符号链接是否存在 -e,!-e。
7.检测可执行文件是否存在 -x,!-x。

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}
Syntax:	return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if

停止执行并返回错误码,如果指定 444,直接关闭连接不反悔响应头。

Syntax:	rewrite regex replacement [flag];
Default: —
Context: server, location, if

重写指令,如果 uri 匹配到了 regex,则会替换成 replacement。

flag 可以是下面的一个。

last  停止执行当前指令集并重新开启新的搜寻。

break  停止执行当前指令集,类似上面的 break。

redirect  返回 302 状态码,临时跳转。

permanent  返回永久跳转 301。

例子:

server {
    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}

上面的重写如果放在 location /download/ 内部,那么应该使用 break,否则循环10次后将报 500 错误。

location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
    return  403;
}

如果 替换的字符串有新的参数,那么会自动老参数和新参数会自动合在一起,如果想丢弃老参数,可以在末尾带上?。

rewrite ^/users/(.*)$ /show?user=$1? last;

如果正则里面包含 } 或 ; 字符,那么需要用单或者双引号括起来。  

Syntax:	rewrite_log on | off;
Default: rewrite_log off;
Context: http, server, location, if

是否把重写日志记录到 error_log 里,notice级别。

Syntax:	set $variable value;
Default: —
Context: server, location, if

设置变量的值,值可以是文本,变量或者组合。

Syntax:	uninitialized_variable_warn on | off;
Default: uninitialized_variable_warn on;
Context: http, server, location, if

对于对未初始化的变量的警告记录日志。

重写的一些指令是在配置文件解析的时候编译的。比如下面的配置。

location /download/ {
    if ($forbidden) {
        return 403;
    }

    if ($slow) {
        limit_rate 10k;
    }

    rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}

当 if块里 $slow 为 true,ngx_http_rewrite_module 模块会为 if 块单独生成配置指令。


 备注

1.测试环境centos7 64位,nginx版本为 1.14.0。
2.读者也可以参考官方文档 nginx documentation
3..原文地址http://www.freecls.com/a/2712/c4


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。