ingress-nginx-url重写的经验总结

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 执行顺序

  1. 执行server块的rewrite指令;
  2. 执行location匹配;
  3. 执行配到location中的rewrite指令;

二、Rewrite 相关指令

2.1 if 指令

描述:判断条件;
语法:if (condition) { ... }
作用域:server,location

if ($request_method = POST){
    
    
  ...
}

condition可以是:

  1. 变量名:如果这个变量是空字符串或者以0开始的字符串,则返回false,否则为true;
  2. = 和 !=:比较的一个变量和字符串;
  3. ~ 和 ~*:匹配正则表达式;
  4. -f 和 !-f:检查一个文件是否存在;
  5. -d 和 !-d:检查一个目录是否存在;
  6. -e 和 !-e:检查一个文件、目录、符号链接是否存在;
  7. -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永久重定向

lastbreak标记的区别: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匹配到;
~ 开头表示区分大小写的正则匹配 ;
~* 开头表示不区分大小写的正则匹配;
!~``开头表示区分大小写不匹配; !~*开头表示不区分大小写的正则不匹配;
/ 表示通用匹配,任何请求都会匹配到;

猜你喜欢

转载自blog.csdn.net/zhongliwen1981/article/details/122319993