在不更改浏览器的情况下重写 Kubernetes ingress-nginx url

Kubernetes ingress-nginx rewrite without changing browser url

我们想在site.abc.com中加载example.xyz.com。最好的办法是redirect/rewrite所有从site.abc.comexample.xyz.com的请求。但是,我们不希望浏览器 URL 被更改。 From this similar SO problem 我们知道我们需要一个如下所示的 Nginx 位置配置

server {
    servername site.abc.com;
    listen        80;
    ....
    ....
    ....
    ....
    location / {                  
        proxy_pass  http://example.xyz.com;
        rewrite /(.*)$ / break;
    }
}

但是,我不确定如何在 Kubernetes ingress-nginx 中创建类似的规则,因为它会为每个规则添加 proxy_pass,这会阻止我们在 [=] 中添加 proxy_pass 配置13=]注释.

还在入口提供nginx.ingress.kubernetes.io/rewrite-target: http://example.xyz.com/注解如下,重定向到example.xyz.com而不是加载example.xyz.comsite.abc.com.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://example.xyz.com/
  name: url-rewrite
  namespace: default
spec:
  rules:
  - host: site.abc.com
    http:
      paths:
      - backend:
          service:
            name: service
            port:
              number: 80
        path: /(.*)
        pathType: ImplementationSpecific

我们如何在 site.abc.com 中加载 example.xyz.com 而无需在浏览器中进行任何更改 URL在这种情况下使用 ingress-nginx?

有了 this solution as a reference, pointed out by @WytrzymałyWiktor,我能够进行更改并且成功了。 这是更新后的入口文件。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      location ~ "^/(.*)" {
        proxy_pass http://example.xyz.com;
        rewrite /(.*)$ / break;
      }
  name: url-rewrite
  namespace: default
spec:
  rules:
  - host: site.abc.com

这里有一个问题是使 SSL 重定向起作用。在某些情况下,目标(http://example.xyz.com) will return 302 /some/other/path in such cases http://site.abc.com gets redirected as http://site.abc.com/some/other/path. Not sure how to make it to redirect as https://site.abc.com/some/other/path。 设置 nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/force-ssl-redirect: "true" 似乎不起作用。

将此添加为文档的答案,因为它会对遇到类似问题的人有所帮助。不可能重复,因为引用的解决方案解决了添加 proxy_pass 的问题,而这解决了 URL 在不更改浏览器 URL.

的情况下重写的问题