一、ngx_http_rewrite_module
rewrite
模块即ngx_http_rewrite_module
模块,主要功能是改写请求URI,是Nginx默认安装的模块。
rewrite
模块会根据PCRE正则
匹配重写URI,或者直接返回资源(200|404
),或者发起内部跳转再匹配location
,或者直接做30x
重定向返回客户端。
ngx_http_rewrite_module
模块的指令有break
, if
, return
, rewrite
, set
。
二、rewrite语法
1 | rewrite <regex> <replacement> [flag] |
- flag标记说明:
- last #本条规则匹配完成后,继续向下匹配新的location URI规则
- 跳转的总次数不能超过10次
- break #本条规则匹配完成即终止,不再匹配后面的任何规则。
- 停止处理当前的
ngx_http_rewrite_module
指令集 - 如果
break
在location
内,则在该location
内继续进一步处理该请求 - 请求内容存在,返回200;请求内容不存在,则返回404
- 停止处理当前的
- redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
- last #本条规则匹配完成后,继续向下匹配新的location URI规则
1 | rewrite ^/(.*) http://www.czlun.com/$1 permanent; |
1 | rewrite /test/.* /index.html break; |
注:
rewrite
只能对域名后边的除去传递的参数外的字符串起作用如果
replacement
以http://
,https://
, or$scheme
开头,处理将会终止,请求结果会以重定向的形式返回给客户端如果
replacement
字符串里有新的request
参数,那么之前的参数会附加到其后面,如果要避免这种情况,那就在replacement
字符串后面加上?
如果正则表达式(regex)里包含
}
or;
字符,需要用单引号或者双引号把正则表达式引起来
三、return语法
1 | return code [text] | code URL | URL; |
停止任何的进一步处理,并且将指定状态码返回给客户端
return的参数有四种形式:
return code
此时,响应内容就是nginx所默认的,比如503 Service Temporarily Unavailablereturn code text
因为要带响应内容,因此code不能是具有跳转功能的30xreturn code URL
此时URI可以为URI做内部跳转,也可以是具有http://
或者https://
等协议的绝对URL,直接返回客户端,而code是30xreturn URL
此时code默认为302,而URL必须是带http://
等协议的绝对URL
四、PCRE正则
表达式
字符 | 描述 |
---|---|
\ | 转义字符。如“\n”匹配一个换行符 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” |
+ | 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o” |
? | 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” |
. | 匹配除“\n”之外的任何单个字符。 若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式。 |
(pattern) | 匹配括号内pattern并可以在后面获取对应的匹配。 常用$0…$9属性获取小括号中的匹配内容,要匹配圆括号字符需要(Content) |
1 | server { |
五、逻辑判断
操作符 | 含义 |
---|---|
=,!= | 比较的一个变量和字符串。 |
~,~* | 与正则表达式匹配的变量,如果这个正则表达式中包含 },; 则整个表达式需要用“或’包围。 |
-f,!-f | 检查一个文件是否存在。 |
-d,!-d | 检查一个目录是否存在。 |
-e,!-e | 检查一个文件、目录、符号链接是否存在。 |
-x,!-x | 检查一个文件是否可执行。 |
六、常用变量
变量 | 含义 |
---|---|
$args | 这个变量等于请求行中的参数,同$query_string |
$content_length | 请求头中的Content-length字段。 |
$content_type | 请求头中的Content-Type字段。 |
$document_root | 当前请求在root指令中指定的值。 |
$host | 请求主机头字段,否则为服务器名称。 |
$http_user_agent | 客户端agent信息 |
$http_cookie | 客户端cookie信息 |
$limit_rate | 这个变量可以限制连接速率。 |
$request_method | 客户端请求的动作,通常为GET或POST。 |
$remote_addr | 客户端的IP地址。 |
$remote_port | 客户端的端口。 |
$remote_user | 已经经过Auth Basic Module验证的用户名。 |
$request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成。 |
$scheme | HTTP方法(如http,https)。 |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值。 |
$server_name | 服务器名称。 |
$server_port | 请求到达服务器的端口号。 |
$request_uri | 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。 |
$uri | 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 |
$document_uri | 与$uri相同。 |
1 | # 限制浏览器访问 |