繁体   English   中英

Kubernetes 入口重写目标和重写正则表达式/捕获组 (?i)

[英]Kubernetes ingress rewrite-target and the rewrite regex/capture group (?i)

基于本指南

我创建了这个入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: ing-something
  namespace: samples
spec:
  rules:
  - host: myhost.internal
    http:
      paths:
      - backend:
          serviceName: my-app
          servicePort: 8080
        path: /api(/|$)(.*)
  tls:
  - hosts:
    - myhost.internal
    secretName: lets
status:
  loadBalancer:
    ingress:
    - {}

当我查看生成的 nginx.config 的底部时,它包含:

## start server myhost.internal
server {
    server_name myhost.internal ;
    
    listen 80;
    
    set $proxy_upstream_name "-";
    set $pass_access_scheme $scheme;
    set $pass_server_port $server_port;
    set $best_http_host $http_host;
    set $pass_port $pass_server_port;
    
    listen 443  ssl http2;
    ...
    location ~* "^/api(/|$)(.*)" {
        
        set $namespace      "samples";
        set $ingress_name   "ing-something";
        set $service_name   "my-app";
        set $service_port   "8080";
    set $location_path  "/api(/|${literal_dollar})(.*)";
        
        ...
        

        
        rewrite "(?i)/api(/|$)(.*)" /$2 break;
        proxy_pass http://upstream_balancer;
        
        proxy_redirect                          off;
        
    }
    
    location ~* "^/" {
        
        set $namespace      "";
        set $ingress_name   "";
        set $service_name   "";
        ...
    }

我不明白这部分(?i)来自哪里:

        rewrite "(?i)/api(/|$)(.*)" /$2 break;

以及这意味着什么。

有任何想法吗?

这是一个基于评论信息的社区 wiki 答案,并发布以提高可见性。 随意扩展它。

正如评论中已经指出的那样,默认情况下路径匹配不区分大小写

使用nginx.ingress.kubernetes.io/use-regex注释将指示在 Ingress 上定义的路径是否使用正则表达式。 默认值为false

以下将表明正在使用正则表达式路径:

 nginx.ingress.kubernetes.io/use-regex: "true"

以下将指示未使用正则表达式路径:

 nginx.ingress.kubernetes.io/use-regex: "false"

当此注释设置为true时,将在给定主机的所有路径上强制执行不区分大小写的正则表达式位置修饰符,而不管它们是在什么 Ingress 上定义的。

此外,如果在给定主机的任何 Ingress 上使用了rewrite-target注释,则将在给定主机的所有路径上强制执行不区分大小写的正则表达式位置修饰符,而不管它们是在什么 Ingress 上定义的。

请在使用此修饰符之前阅读入口路径匹配

所有关于模式修改器的细节都可以在这里找到:

模式修饰符语法由两个在正则表达式风格中不同的元素组成。 括号和问号用于将修饰符添加到正则表达式。 根据正则表达式中的 position 和正则表达式风格,它可能会影响整个正则表达式或其中的一部分。 如果一种风格至少支持一种修饰符语法,那么它还将支持一个或多个可在修饰符内使用的字母来切换特定模式。 如果不是,则为该口味的所有字母指示“n/a”。

注意不区分大小写的正则表达式中的指定模式

(?i)    Turn on case insensitivity. (?i)a matches a and A.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM