【问题标题】:Make links in response relative to new path建立相对于新路径的链接
【发布时间】:2019-09-07 03:40:46
【问题描述】:

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

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

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

当我访问https://mysite/odin 的页面时。它工作并返回响应:

HTML 响应是:

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

    </body>
</html>

但是,如您所见,相对链接类似于&lt;a href="/v0/index"&gt;Home&lt;/a&gt;。如果我单击它,它将无法正常工作,因为没有像 http://mysite/v0/index 这样的链接。如果我点击链接,我希望它转到http://mysite/odin/v0/index。是否可以通过将响应中的链接修改为具有odin 或者如果我确实单击它,它会查看源网址,即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 kubernetes nginx-ingress


    【解决方案1】:

    我遇到了类似的问题,并且受到您的问题的启发,我找到了一个对我有用的解决方案。 您的注释应该像这样工作:

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

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

    【讨论】:

    • 由于 OP 的 HTML 中的绝对hrefs,这仍然不起作用。
    • 值得注意的是,http_sub_module 仅在入口和后端服务之间不使用压缩时才有效!我在这里更详细地描述了这一点:stackoverflow.com/a/68246312/3276634
    【解决方案2】:

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

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

    我可以看到两种可能性:

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

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

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

    如果 href 标签之间一致,则对“2)”进行修改以使其成为更可行的替代方案,而不是基本上匹配任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 2018-11-06
      • 2013-03-19
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2021-01-20
      相关资源
      最近更新 更多