Kubernetes NGINX Ingress 配置映射的 301 重定向

8
在Kubernetes中使用NGINX Ingress,我无法找到在每个主机上从非www转发流量或转发到另一个域名的方法。我查看了配置文档,但找不到需要的内容。也许可以在Ingress本身中添加。我还看到过使用注释的示例,但这似乎是整个Ingress范围内的,因此我无法具有每个主机的特定重定向。
3个回答

21

确实,通过简单的注释可以实现重定向:

但正如您所提到的,它是"Ingress"范围的,无法针对每个主机、每个域名甚至每个路径进行配置。因此,您需要通过ingress.kubernetes.io/configuration-snippet注释自己完成重定向,这个注释依赖于正则表达式,给您带来了很大的权力:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: self-made-redirect
  annotations:
    ingress.kubernetes.io/configuration-snippet: |
      if ($host = 'blog.yourdomain.com') {
        return 301 https://yournewblogurl.com;
      }
      if ($host ~ ^(.+)\.yourdomain\.com$) {
        return 301 https://$1.anotherdomain.com$request_uri;
      }
spec:
  rules:
  - host: ...

如果您还不太熟悉NGINX,那么通过代码片段了解更多可能性,特别是在NGINX文档中关于$host变量的解释。


1
我刚刚部署了这个程序,它完美地运行了,谢谢! - Ben Gannaway
我不知道以前是否有所不同,但现在很难找到一个可行的解决方案。这个答案是最有帮助的,但有些东西需要改变:它不是ingress.kubernetes.io/configuration-snippet,而是nginx.ingress.kubernetes.io/configuration-snippet。 - Boyko Karadzhov

5
为了将example.com和www.example.com的所有流量重定向到newdomain.example.com,无论使用HTTP还是HTTPS,我最终采用了以下解决方案。
在这个例子中,我也使用cert-manager.io来请求www.example.com和example.com的证书。
重定向是使用注释nginx.ingress.kubernetes.io/permanent-redirect完成的。
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: redirect-example-to-newdomain
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/permanent-redirect: https://newdomain.example.com
spec:
  tls:
    - hosts:
      - example.com
      - www.example.com
      secretName: example.com-tls
  rules:
    - host: example.com
    - host: www.example.com

0

我在使用注释 server-snippet 时遇到了问题。当证书更新时,该进程会崩溃。当我删除注释后,证书更新成功。是否有其他解决方案?例如,在单独的 pod 中创建一个重定向 301?

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        cert-manager.io/cluster-issuer: letsencrypt-prod
        certmanager.k8s.io/cluster-issuer: letsencrypt-prod
        ingress.kubernetes.io/ssl-redirect: "true"
        meta.helm.sh/release-name: DOMAIN
        meta.helm.sh/release-namespace: DOMAIN
        nginx.ingress.kubernetes.io/configuration-snippet: |
          location ~ ^/online-web {
            return 301 /online;
          }
          if ($host = 'DOMAIN-alias.cz') {
            return 301 https://DOMAIN.cz;
          }
          if ($host ~ ^(.+)\.DOMAIN-alias\.cz$) {
            return 301 https://$1.DOMAIN.cz$request_uri;
          }
          if ($host = 'DOMAIN-alias-2.cz') {
            return 301 https://DOMAIN.cz;
          }
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
    nginx.ingress.kubernetes.io/server-snippet: |
      if ($host ~ "csas.woltair.cz") {
          return 301 https://woltair.cz/zakaznik/doporuceni;
      }
............
............
  - host: csas.woltair.cz
    http:
      paths:
      - backend:
          service:
            name: woltair-cz-fe
            port:
              number: 8080
        path: /zakaznik/doporuceni
        pathType: ImplementationSpecific

如果您有新问题,请通过单击提出问题按钮进行提问。如果有助于提供上下文,请包括此问题的链接。- [来源审查](/review/late-answers/31025826) - zephryl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接