如何使用 NGINX K8S ingress 将“old.foo.com/foo”重定向到“new.foo.com/foo”,而不破坏证书管理器?

如何使用 NGINX K8S ingress 将“old.foo.com/foo”重定向到“new.foo.com/foo”,而不破坏证书管理器?

在我的 K8S 入口配置中,我尝试从(例如)重定向old.mywebsite.comnew.mywebsite.com

我可以使用注释来实现这一点nginx.ingress.kubernetes.io/permanent-redirect,但不幸的是,这会导致直接重定向到目标 URL。例如,“old.mywebsite.com/some/path?with=parameters”将重定向到“new.mywebsite.com/”。路径和查询参数会丢失。由于此网站有大量指向旧域的传入链接,因此在保留路径和查询的情况下进行重定向绝对至关重要。

我可以使用配置片段来做我想做的事情:

nginx.ingress.kubernetes.io/server-snippet: |
  if ($host ~ "old.mywebsite.com")
  {
      rewrite ^ https://new.mywebsite.com$request_uri? permanent;
  }

这是可行的,但它会破坏旧子域的证书自动更新,因为对旧域的任何 HTTP 请求都会被重写到新域。

有什么方法可以同时实现这两个目标吗?例如,保留完整请求路径的不同注释或可以为 certbot 产生例外的不同代码段配置?

答案1

经过一些盲目的实验,它似乎确实可以放入$request_uri“永久重定向”注释中的目标 URL。我猜它直接传递到了 NGINX 配置中:

nginx.ingress.kubernetes.io/permanent-redirect: https://new.mypage.com$request_uri

我不认为这个注释会破坏证书管理器,所以这可能是完美的解决方案。

答案2

使用普通的 nginx,你会有一个单独的serverHTTP 块:

server {
    listen 80;

    # Serve ACME verification requests via HTTP
    location /.well-known {
        try_files $uri =404;
    }

    location / {
        return 301 https://new.example.com$request_uri;
    }
}

我不知道 Kubernetes nginx-ingress 配置通常如何工作,所以我无法提供任何有关如何使用其配置系统实现此目的的详细信息。但是,实际 nginx 配置文件中的最终结果应如上所示。

此外,我假设证书的更新是通过位置进行的/.well-known

相关内容