regex - Kubernetes 入口重写目标和重写正则表达式/捕获组 (?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 上定义的。请在使用此修饰符之前阅读入口路径匹配。
所有关于模式修改器的细节都可以在这里找到:
模式修饰符语法由两个在正则表达式风格中不同的元素组成。括号和问号用于将修饰符添加到正则表达式。根据它在正则表达式中的位置和正则表达式的风格,它可能会影响整个正则表达式或其中的一部分。如果一种风格至少支持一种修饰符语法,那么它还将支持一个或多个可在修饰符内使用的字母来切换特定模式。如果不是,则为该口味的所有字母指示“n/a”。
注意不区分大小写的正则表达式中的指定模式:
(?i) Turn on case insensitivity. (?i)a matches a and A.
推荐阅读
- ffmpeg - ffmpeg libav:有什么方法可以以输入格式设置流信息而不是搜索它?
- json - 解组 json 以浮动。为什么需要 float64?
- c# - 我应该选择 C# 7.0 元组而不是 `out` 吗?
- nginx - 为什么 Brotli 命令行只允许到 9 级?
- django-models - 如何修复“Follow.s_id”不是“用户”的外键。”在这个模型中
- paperjs - 如何在 html 中使用 paper.js 作为背景
- bash - 在bash中的反引号内进行变量扩展的Shell注入
- embedded - XMEGA-A3BU Xplained - 通过使用 DMA 轮询确定是否按下按钮 1
- python - 在python中将嵌套的JSON数据提取到Pandas Dataframe
- python - PyQt,设置特定数量的行编辑输入