【问题标题】:How to capture subdomain in nginx ingress如何在 nginx 入口中捕获子域
【发布时间】:2022-02-13 13:02:09
【问题描述】:

我想捕获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 捕获子域?

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress


    【解决方案1】:

    我相信您想要重定向而不是重写。这是您需要的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/$1 ;
      }
    

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

    ?&lt;capturename&gt;$capturename 对是您正在寻找的技巧。

    【讨论】:

      【解决方案2】:

      你可以试试

      apiVersion: networking.k8s.io/v1beta1
      kind: Ingress
      metadata:
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /$2
          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: (/|$)(.*)
      

      【讨论】:

        猜你喜欢
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 2018-03-23
        • 1970-01-01
        • 2020-12-30
        • 2013-10-23
        相关资源
        最近更新 更多