Ingress 配置中关于重写的注解有:
注解名 |
描述 |
nginx.ingress.kubernetes.io/app-root |
访问主域名的时候会自动跳转到app-root 注解指定的路径 |
nginx.ingress.kubernetes.io/rewrite-target |
将匹配到的url重定向到rewrite-target 注解指定的路径 |
nginx.ingress.kubernetes.io/server-snippet |
使用注解可以在server{...} 配置块中添加自定义的配置 |
nginx.ingress.kubernetes.io/configuration-snippet |
使用该注解可以在Nginx的location{...} 位置添加额外配置 |
官方介绍:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/
下面重点介绍如何使用Ingress-Nginx
自定义配置实现规则的重写(Rewrite)。
一、Rewrite 执行顺序
- 执行server块的rewrite指令;
- 执行location匹配;
- 执行配到location中的rewrite指令;
二、Rewrite 相关指令
2.1 if 指令
描述:判断条件;
语法:if (condition) { ... }
作用域:server,location
if ($request_method = POST){
...
}
condition可以是:
- 变量名:如果这个变量是空字符串或者以0开始的字符串,则返回false,否则为true;
- = 和 !=:比较的一个变量和字符串;
- ~ 和 ~*:匹配正则表达式;
- -f 和 !-f:检查一个文件是否存在;
- -d 和 !-d:检查一个目录是否存在;
- -e 和 !-e:检查一个文件、目录、符号链接是否存在;
- -x 和 !-x:检查一个文件是否可执行;
2.2 return 指令
描述:返回状态码给客户端,或重定向到指定URL,完成客户端请求的处理。
语法:return [CODE] [URL]
作用域:server,location
return 301 https://m.example.com;
3.3 rewrite 指令
描述:该指令通过正则来改变url,可以同时存在一个或者多个rewrite指令。
语法:rewrite regex replacement [flag];
作用域:server,location,if
参数说明:
regex
:用于匹配uri的正则表达式。使用圆括号()
标记要截取的内容
replacement
:匹配成功后用于替换uri中被截取内容的字符串,默认情况下,如果该字符串是由http://或者https://开头的,则不会继续向下对uri进行其他处理,而是直接将重写后的uri返回给客户端;
flag
:来设置rewrite对uri的处理行为,具体值如下:
flag参数值 |
描述 |
last |
停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找 |
break |
停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行 |
redirect |
如果replacement不是以http:// 或https://开始,返回302临时重定向 |
permant |
返回301永久重定向 |
last
和break
标记的区别:last
标记在本条rewrite规则执行完后,会对其所在的server { … }
标签重新发起请求,而break
标记则在本条规则匹配完成后,不再继续匹配。
rewrite ^/api/user /api/v1/user break;
如果要引用匹配到的内容,那么需要使用小括号()
将正则表达式包含起来,然后通过$num
来引用匹配到的内容。比如:$1
表示引用第一个括号匹配的内容,$2
表示的是前面第二个()匹配的内容。
rewrite ^/api/(user|order|com)/(.*) /api/v1/$1/$2 break;
三、变量
3.1 自定义变量
定义变量可以使用set
指令,其格式:
set $变量名 变量值;
set指令的作用范围是server、location、if。
如果使用变量,可以直接通过变量名进行访问。
set $agentFlag 0;
if ( $http_user_agent ~* "(Mobile)" ) {
set $agentFlag 1;
}
if ( $agentflag = 1 ) {
return 301 https://m.example.com;
}
3.2 自带变量
Nginx默认自带一些变量,可以很方便的获取到服务器环境的各种信息。
变量名 |
描述 |
$args |
请求行参数,同$query_string |
$content_length |
Content-length请求头 |
$content_type |
Content-Type请求头 |
$document_root |
当前请求在root指令中指定的值 |
$host |
主机名或服务器名称 |
$http_user_agent |
客户端信息 |
$http_cookie |
cookie日志信息 |
$limit_rate |
连接速率限制 |
$request_method |
请求方式 |
$remote_addr |
客户端IP |
$remote_port |
客户端端口 |
$remote_user |
经过Auth Basic Module验证的用户名 |
$request_filename |
当前请求的文件路径,由root或alias指令与URI请求生成 |
$scheme |
请求方法 |
$server_protocol |
服务器协议版本 |
$server_addr |
服务器地址 |
$server_name |
服务器名称 |
$server_port |
服务器端口号 |
$request_uri |
包含请求参数的原始URI,但不包含主机名 |
$uri |
同上,但是不带请求参数 |
$document_uri |
同$uri |
四、Location匹配规则
=
开头表示精确匹配;
^~
开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa
匹配到;
~
开头表示区分大小写的正则匹配 ;
~*
开头表示不区分大小写的正则匹配;
!~``开头表示区分大小写不匹配; !~*
开头表示不区分大小写的正则不匹配;
/
表示通用匹配,任何请求都会匹配到;