创建链接以响应相对于新路径
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)”使其成为更可行的替代方案。
如何在我的回复中重定向所有 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)”使其成为更可行的替代方案。