【问题标题】:Kubernetes ingress nginx redirecting domain and also apply to all redirected domain's subdomainsKubernetes ingress nginx 重定向域,也适用于所有重定向域的子域
【发布时间】:2020-07-14 19:39:14
【问题描述】:

我想在 Kubernetes 入口 Nginx 中重定向主域,但希望将子域应用于重定向的主域。

这是示例网站:my.website.com

在这个网站里面有很多子域是/abc、/def、/abc/aa、/def/bb等。

对于我的 Kubernetes 入口 Nginx,我想将 my.website.com 重定向到 this.website.com 并且还希望所有子域重定向到 this.website.com

这是我想要的示例:

my.website.com/abcthis.website.com/abc

这是我尝试过的重定向入口 yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: https://this.website.com
  name: redirect-subdomains-too
spec:
  rules:
  - host: my.website.com
    http:
      paths:
      - backend:
          serviceName: redirect-service
          servicePort: 7990
        path: /

显然,当我尝试 my.website.com/abcmy.website.com/abc/aa 时,这将重定向到 this.website.com 而不是 this.website.com/abcthis.website.com/abc/aa

如何编写这个入口?

【问题讨论】:

标签: kubernetes kubernetes-ingress


【解决方案1】:

永久重定向就像所有内容的“硬代码”。您可能想要rewrite 和/或server-snippet。然后您可以为每个主机设置多个主机规则:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/server-snippet: |
        if ($host ~ "my.website.com|my2.website.com")
        {
            rewrite ^ https://this.website.com$request_uri permanent;
        }
  name: redirect-subdomains-too
spec:
  rules:
  - host: my.website.com
    http:
      paths:
      - backend:
          serviceName: redirect-service
          servicePort: 7990
        path: (/|$)(.*)
  - host: my2.website.com
    http:
      paths:
      - backend:
          serviceName: redirect-service
          servicePort: 7990
        path: (/|$)(.*)
  - host: this.website.com
    http:
      paths:
      - backend:
          serviceName: redirect-service
          servicePort: 7990
        path: (/|$)(.*)

你总是可以通过运行来检查配置:

kubectl exec -t <nginx-ingress-pod> cat nginx.conf

【讨论】:

  • server-snippet 很接近,但添加 $request_uri 会导致重复的查询参数。不幸的是,nginx 似乎没有像$request_path 这样的变量,这在这里很理想。我读到$uri几乎是请求路径,但可以通过nginx修改。
  • 我能够成功使用它,但是:"nginx.ingress.kubernetes.io/server-snippet" = "if ($host ~ \"www.mywebsite.com\") { return 308 https://mywebsite.com$request_uri; }"
【解决方案2】:

你只需要一个入口来重定向到另一个 URL...

例如..您有一个名为 adonai.domain.com 的入口,另一个名为 egg.domain.com。当尝试获取http://eggs.domain.com 时,您需要重定向到http://adonai.domain.com 对吗?这样做;

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
            nginx.ingress.kubernetes.io/permanent-redirect: http://adonai.domain.com
      name: web2
      namespace: default
    spec:
      ingressClassName: nginx
      rules:
      - host: ovo.domain.com

您不需要后端或 spec.rules 中的其他设置。只需主机接收和重定向,ingress-nginx-controller 为您完成其余的工作。

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2014-01-13
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2020-11-28
    • 2018-09-13
    • 2013-05-09
    • 2021-09-09
    相关资源
    最近更新 更多