nginx rewrite 官方说明
ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI,返回重定向并有条件地选择配置。
break,if,return,rewrite和set指令按以下顺序处理:
在服务器级上指定的该模块的指令是按顺序执行的;
重复过程:
基于请求URI来搜索位置;
在找到的位置内指定的该模块的指令是按顺序执行;
如果请求URI被重写,则重复循环但不超过10次。
nginx rewrite模块具有以下主要指令:
break
if
return
rewrite
rewrite_log
set
官方说明见: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
rewrite 指令(rewrite配置)
配置位置:rewrite指令可以在location、server、if上下文中使用。
语法:rewrite regex replacement [flag];
regex:符合PCRE规范的正则表达式。
replacement:改写后的URL。
[flag]:可选标记。
last - 最后一个规则
停止处理当前的ngx_http_rewrite_module指令集并开始搜索匹配更改的URI的新位置;
break - 终止
与break指令一样停止处理当前的ngx_http_rewrite_module指令集;
redirect - 302临时重定向
返回302代码的临时重定向; 在替换字符串不以“http://”,“https://”或“$ scheme”开头时使用;
permanent - 永久重定向
返回301代码的永久重定向。
rewrite举例
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
rewrite 基础正则表达式介绍
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
运算符号、比较方法(if/location)
一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
使用= ,!= 比较的一个变量和字符串,true/false
使用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含右花括号}或者分号;则必须给整个正则表达式加引号
使用-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相同。