创建链接以响应相对于新路径

Make links in response relative to new path

如何在我的回复中重定向所有 hrefs 以点击我的新路径。例如,我的入口文件是

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-odin
  annotations:    
    nginx.ingress.kubernetes.io/rewrite-target: /

spec:
  rules:
  - http:
      paths:
      - path: /odin/?(.*)
        backend:
          serviceName: flask-app-tutorial
          servicePort: 8080

当我访问 https://mysite/odin 的页面时。它有效并且 returns 返回响应:

HTML 响应是:

<html>
..
    <body>
        <div>
            <a href="/v0/index">Home</a>
            <a href="/v0/login">Login</a>
        </div>

    </body>
</html>

但是,如您所见,相对的 link 就像 <a href="/v0/index">Home</a>。如果我点击它,它将不起作用,因为没有像 http://mysite/v0/index 这样的 link。如果我单击 link,我希望它转到 http://mysite/odin/v0/index。是否可以通过将响应中的 links 修改为具有 odin 或者如果我确实单击它,它会查看源 url 即 http://mysite/odin 并定向它相对于那个?

Nginx Version: 1.15.10
ingress-nginx: 0.24.0

到目前为止,我已经尝试了以下方法。

nginx.ingress.kubernetes.io/configuration-snippet: |
  proxy_set_header Accept-Encoding ""; #disable compression
  sub_filter '<head>' '<head> <base href="/odin/">';


nginx.ingress.kubernetes.io/add-base-url: ":true"
nginx.ingress.kubernetes.io/app-root: /odin

nginx.ingress.kubernetes.io/use-regex: "true"

我也试过this

 change the spec.rules.host.paths.path from /odin/?(.*) to/(odin/.*)

以上建议可能有错别字。我认为应该 http 而不是 host.

我遇到了类似的问题,受您问题的启发,我找到了适合我的解决方案。 您的注释应如下所示:

nginx.ingress.kubernetes.io/configuration-snippet: |
  sub_filter_once on;
  sub_filter '<base href="/"' '<base href="/odin/"';

如您所见,sub_filter 现在已启用,我使用 base 而不是 head

即使您按照其他答案中的建议通过包含 sub_filter_once on; 来修复 sub_filter 配置片段,它也不会起作用,因为 base 标记仅适用于相对路径(参见:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base).

app-root 解决方案在技术上是正确的,但归结为与 <base href=... /> 相同的东西,因此对于带有前导斜杠的 href 标记也会失败。

我可以看到两种可能性:

1) 您可以修复所有 href 标签,删除前导斜线。如果这样做,两种解决方案都应该有效。

2) 您可以尝试将位置规则更改为 - path: /(odin)?/?(.*) 并将注释重写为:nginx.ingress.kubernetes.io/rewrite-target: /(不要忘记也包含 nginx.ingress.kubernetes.io/use-regex: "true" 注释),它将也可以使用前导斜杠。

虽然它看起来很脆弱,因为规则现在将匹配(几乎)任何东西,并且您失去了使用具有不同路径前缀的 NGINX 扇出的可能性。

如果 /v0 前缀在 href 标签中是一致的,而不是基本上任何东西,

修改“2)”使其成为更可行的替代方案。