如何在 nginx ingress 中捕获子域

How to capture subdomain in nginx ingress

我想捕获subdomain并用/subdomain重写URL,例如bhautik.bhau.tk重写为bhau.tk/bhautik

我也https://github.com/google/re2/wiki/Syntax试过组语法

这是我的 nginx 入口配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: subdomain
  namespace: subdomain
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    # nginx.ingress.kubernetes.io/rewrite-target: /$sub
    nginx.ingress.kubernetes.io/server-snippet: |
      set $prefix abcd;
      if ($host ~ ^(\w+).bhau\.tk$) {
        // TODO? 
      }
    nginx.ingress.kubernetes.io/rewrite-target: /$prefix/$uri
spec:
  rules:
  - host: "*.bhau.tk"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: subdomain
            port:
              number: 80

如何从 $host 捕获子域?

我相信您想要重定向而不是重写。这是您需要的server-snippet

nginx.ingress.kubernetes.io/server-snippet: |
  if ($host ~ ^(?<subdom>\w+)\.(?<basedom>bhau\.tk)$) {
    return 302 https://$basedom/$subdom/ ;
  }

如果您真的想要重写,用户看到的 URL 保持不变,但请求将路由到由同一服务提供的子路径:

nginx.ingress.kubernetes.io/server-snippet: |
  if ($host ~ ^(?<subdom>\w+)\.(?<basedom>bhau\.tk)$) {
    rewrite ^/(.*)$ /$subdom/ ;
  }

删除指定 $prefixrewrite-target 注释。你不需要它。

?<capturename>$capturename 组合正是您要找的技巧。

您可以试试

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/server-snippet: |
        if ($host ~ "bhautik.bhau.tk")
        {
            rewrite ^ https://bhau.tk$host permanent;
        }
  name: test-ingress
spec:
  rules:
  - host: bhau.tk
    http:
      paths:
      - backend:
          serviceName: app-service
          servicePort: 3000
        path: (/|$)(.*)