nginx的rewrite模块
ngx_http_rewrite_module是通过对内置变量$request_uri进行正则处理, 改写用户请求的uri, 包括多条常用的指令如break/if/return/rewrite等.
1. break指令
停止当前request_uri的后续rewrite规则处理.
可以在server/location/if等指令中使用.
2. if指令
1 | if (condition) { ... } |
可以在server/location等指令中使用.
3. return指令
1 | return code [text]; |
停止后续所有处理返回code给client端, 注意return 444将关闭连接不返回任何数据.
可以在server/location/if等指令中使用.
通过return将http重定向到https, 有两种方法1
2
3
4# server_name is customed by user in server.
return 301 https://$server_name$request_uri;
# http_host is a embedded variable in nginx.
return 301 https://$http_host$request_uri;
4. rewrite指令
1 | rewrite regex replacement [flag]; |
可以在server/location/if等指令中使用.
rewrite按照在配置文件中出现的顺序进行处理, 具体行为由flag决定.
但是如果某个replacement值由http://(https://)开头, 则停止处理返回给client.
四种flag作用:
last: 停止当前rewirte模块后续规则处理.
将修改后的url重新按照location规则进行匹配处理.
即是说(rewrite .. last)在location{}中可能被循环处理, 而在server{}中不会.
循环次数超过10次则停止处理并返回500错误.
break: 与上面的break指令一样.
redirect: 返回一个临时302重定向.
permanent: 返回一个永久301重定向.
例如给请求url添加前缀prefix:1
2
3
4
5location ^~ / {
if ($request_uri !~ ^/prefix) {
rewrite ^(.*)$ /prefix/$1 break;
}
}
5. rewrite_log指令
1 | rewrite_log on | off; |
可以在http/server/location/if等指令中使用.
启动rewrite log(写到文件error_log), 日志级别为notice.
6. set指令
1 | set $variable value; |