指令
break
if
return
rewrite
rewrite_log
set
uninitialized_variable_warn
执行顺序
- 基于请求的URI查找匹配的location
- 依次执行找到的location中的指令
- 根据规则修改URI
重复执行上述步骤, 知道找到对应的资源, 但循环次数不超过10次, 超过10次会返回500错误
break
作用域: server, location, if
if
语法: (condition) { ... }
作用域: server, location
如果满足
condition
, 则执行指令后的内容
判断条件
- 变量名 如果是
空字符串
或"0"
, 则变量的值为false1.0.1版本前, 以
"0"
开头的字符串, 值会被认为是false - 使用
"="
和"!="
运算符将变量与字符串进行比较; - 使用
"~"
(大小写敏感)和"~*"
(大小写不敏感)将变量与正则表达式进行匹配- 如果是不匹配, 可使用
"!"
, 即"!~"
和"!~*"
- 如果正则表达式里有
"}"
或";"
, 需用单引号或者双引号把整个正则表达式包着
- 如果是不匹配, 可使用
- 使用 -f ,!-f 检查一个文件是否存在
- 使用 -d, !-d 检查一个目录是否存在
- 使用 -e ,!-e 检查一个文件、目录、符号链接是否存在
- 使用 -x , !-x 检查一个文件是否可执行
return
语法:
return code [text];
return code URL;
return URL;
作用域: server, location, if
停止处理, 返回指定的code
给客户端, 非标准码444则关闭连接且不发送响应头
0.8.42版本开始, 可以返回重定向URL(code为301, 302, 303, 307或308)或者返回响应体text
(其他code的情况)
rewrite
语法: rewrite regex replacement [flag];
作用域: server, location, if
如果URI匹配正则表达式
regex
, 则用replacement
替换, 可以用flag
终止指令的后续处理.
如果replacement
以"http://"
,"https://"
或"$scheme"
开头, 则不会继续后续处理, 返回重定向给客户端.
如果正则表达式里有"}"
或";"
, 需用单引号或者双引号把整个正则表达式包着
flag
可选参数:
last
停止处理后续的ngx_http_rewrite_module指令, 用当前重写的URI在location中重新查找break
停止处理后续的ngx_http_rewrite_module指令, 也不重新在location中查找, 但会继续执行其他非ngx_http_rewrite_module指令redirect
返回302临时重定向, 当replacement
不以"http://"
,"https://"
, 或"$scheme"
开头时使用返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent
返回301永久重定向返回301永久重定向, 浏览器地址栏会显示跳转后的URL地址,爬虫更新url
示例
location ^~ /redirect {
# 当匹配前缀表达式 /redirect/(.*)时 请求将被临时重定向到 http://www.$1.com
# flag 可视为 redirect
rewrite ^/(.*)$ http://www.$1.com;
return 200 "ok"; # 不会被执行
# 访问 localhost:80/redirect/test 会302临时重定向到http://www.test.com, 由于replacement以http://开头, 后面的return不会被执行
location ^~ /redirect {
rewrite ^/(.*)$ www.$1.com;
return 200 "ok";
}
# 发送请求如下
# curl 127.0.0.1:8080/redirect/test
# ok
# URI会被重写为www.test.com, 然后执行下一句return
# rewrite 后面没有任何 flag 时就顺序执行
# 当 location 中没有 rewrite 模块指令可被执行时 就重写发起新一轮location 匹配
location / {
# 顺序执行如下两条rewrite指令
rewrite ^/url1 /url2;
rewrite ^/url2 /url3 last; # 用新的URI '/url3' 在location中重新查找
rewrite ^/url3 /url4;
}
location = /url2 {
return 200 “/url2”;
}
location = /url3 {
return 200 “/url3”;
}
location = /url4 {
return 200 “/url4”;
}
# 发送如下请求
# curl 127.0.0.1:8080/url1
# /url3
# 这里由于有last, 执行到last后, 如果last的内容被执行, 当前模块内剩下的ngx_http_rewrite_module指令不会被执行, 用替换后的URI, 重新去location中查找
location /download {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
# 因为 proxy_pass 不是rewrite模块的指令 所以它不会被 break终止
proxy_pass http://localhost:8888;
}
# 访问 localhost:80/download/media/20220117/music
# 请求会代理到 localhost:8888/20220117/music.mp3
rewrite_log
语法: rewrite_log on | off;
默认值: rewrite_log off;
作用域: http, server, location, if
是否启用以notice级别将ngx_http_rewrite_module指令的处理结果记录到 error_log
set
语法: set $variable value;
作用域: server, location, if
定义变量并赋值,值可以是文本,变量或者文本变量混合体
uninitialized_variable_warn
语法: uninitialized_variable_warn on | off;
默认值: uninitialized_variable_warn on;
作用域: http, server, location, if
是否记录未初始化变量的警告。