nginx - ngx_http_rewrite_module

指令

break
if
return
rewrite
rewrite_log
set
uninitialized_variable_warn

执行顺序
  1. 基于请求的URI查找匹配的location
  2. 依次执行找到的location中的指令
  3. 根据规则修改URI

重复执行上述步骤, 知道找到对应的资源, 但循环次数不超过10次, 超过10次会返回500错误

break

作用域: server, location, if

if

语法: (condition) { ... }
作用域: server, location

如果满足condition, 则执行指令后的内容

判断条件

  • 变量名 如果是空字符串"0", 则变量的值为false

    1.0.1版本前, 以"0"开头的字符串, 值会被认为是false

  • 使用"=""!="运算符将变量与字符串进行比较;
  • 使用"~"(大小写敏感)和"~*"(大小写不敏感)将变量与正则表达式进行匹配
    1. 如果是不匹配, 可使用"!", 即"!~""!~*"
    2. 如果正则表达式里有"}"";", 需用单引号或者双引号把整个正则表达式包着
  • 使用 -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

是否记录未初始化变量的警告。

相关文档链接

Module ngx_http_rewrite_module

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值