在 Istio 网关上使用 url 重写时资源的 HTTP404
HTTP404 for resources when using url rewriting on Istio gateway
我正在尝试将服务部署到 AKS 上的特定 url 地址。下面的 yaml 让我可以访问所需地址的服务,例如 xxxx.europe.cloudapp.azure.com/service-a。这很好用,我设法将整个服务隐藏在所需 url:
下
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: istio
spec:
hosts:
- "*"
gateways:
- istio-gateway
http:
- match:
- uri:
prefix: /service-a
rewrite:
uri: /
route:
- destination:
host: service-a.default.svc.cluster.local
但是当显示欢迎页面时,我只看到文字。未加载 css/javascript/image 个文件。此页面尝试加载的所有内容仍然具有原始 url 地址,我的网关配置没有进行任何重写。所以首页要求这样:
http://xxxxx.europe.cloudapp.azure.com/icon.jpg
而不是这个:
http://xxxxx.europe.cloudapp.azure.com/service-a/icon.jpg
处理重写资源 url 和页面上的 link 的最佳方法是什么?我必须手动更改主页上的 url 吗?
编辑:
更清楚。
- 重写 url 按预期工作,地址正是我想要的(整个服务隐藏在 "xxxx.europe.cloudapp.azure.com/service-a".
下
- 进入 "xxxx.europe.cloudapp.azure.com/service-a" 后,我看到服务的欢迎页面,但没有加载任何 css/jpegs/js。欢迎页面上显示的 links 也不起作用。
- 例如,"icon.jpg" 未加载。页面希望从 http://xxxx.europe.cloudapp.azure.com/icon.jpg but it's not there anymore. Due to rewriting it's available at http://xxxx.europe.cloudapp.azure.com/service-a/icon.jpg 加载它,这是预期的。
我有点期待 http://xxxx.europe.cloudapp.azure.com/icon.jpg request will be automatically rewritten to http://xxxx.europe.cloudapp.azure.com/service-a/icon.jpg。但显然我错了。所以我想知道如何以可管理的方式处理服务本身内的 links - 我的意思是我可以修改应用程序内的每个可能的 link,但是如果我们更改 url 会怎样再次(从 /service-a 到 /service-b)。该服务是用 ASP.NET 核心编写的,我将寻找某种可维护的内部重写解决方案。
由于配置的这一部分,正在重写:
- match:
- uri:
prefix: /service-a
rewrite:
uri: /
这导致匹配的前缀被替换为 rewrite.uri 属性.
的值
示例1:(虚拟服务已激活)
Original: http://www.page.com/service-a/icon.jpg
^--------^
Rewritten: http://www.page.com/icon.jpg
示例2:(此虚拟服务已激活)
Original: http://www.page.com/service-a/service-a/icon.jpg
^--------^
Rewritten: http://www.page.com/service-a/icon.jpg
示例3:(此虚拟服务未激活,回退到其他虚拟服务,或默认路由,或returns 404的黑洞)
Original: http://www.page.com/icon.jpg
Rewriting: DOESN'T HAPPEN
对于重写,没有也不可能,这取决于您的服务。可以找到 Istio 的重写 props 文档 here
如果每个子域都有自己的服务,那么这是一个选项:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: istio
spec:
hosts:
- "service-a.domain.com"
gateways:
- istio-gateway
http:
- match:
- uri:
prefix: /
rewrite:
uri: /service-a
route:
- destination:
host: service-a.default.svc.cluster.local
我正在尝试将服务部署到 AKS 上的特定 url 地址。下面的 yaml 让我可以访问所需地址的服务,例如 xxxx.europe.cloudapp.azure.com/service-a。这很好用,我设法将整个服务隐藏在所需 url:
下apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: istio
spec:
hosts:
- "*"
gateways:
- istio-gateway
http:
- match:
- uri:
prefix: /service-a
rewrite:
uri: /
route:
- destination:
host: service-a.default.svc.cluster.local
但是当显示欢迎页面时,我只看到文字。未加载 css/javascript/image 个文件。此页面尝试加载的所有内容仍然具有原始 url 地址,我的网关配置没有进行任何重写。所以首页要求这样:
http://xxxxx.europe.cloudapp.azure.com/icon.jpg
而不是这个:
http://xxxxx.europe.cloudapp.azure.com/service-a/icon.jpg
处理重写资源 url 和页面上的 link 的最佳方法是什么?我必须手动更改主页上的 url 吗?
编辑:
更清楚。
- 重写 url 按预期工作,地址正是我想要的(整个服务隐藏在 "xxxx.europe.cloudapp.azure.com/service-a". 下
- 进入 "xxxx.europe.cloudapp.azure.com/service-a" 后,我看到服务的欢迎页面,但没有加载任何 css/jpegs/js。欢迎页面上显示的 links 也不起作用。
- 例如,"icon.jpg" 未加载。页面希望从 http://xxxx.europe.cloudapp.azure.com/icon.jpg but it's not there anymore. Due to rewriting it's available at http://xxxx.europe.cloudapp.azure.com/service-a/icon.jpg 加载它,这是预期的。
我有点期待 http://xxxx.europe.cloudapp.azure.com/icon.jpg request will be automatically rewritten to http://xxxx.europe.cloudapp.azure.com/service-a/icon.jpg。但显然我错了。所以我想知道如何以可管理的方式处理服务本身内的 links - 我的意思是我可以修改应用程序内的每个可能的 link,但是如果我们更改 url 会怎样再次(从 /service-a 到 /service-b)。该服务是用 ASP.NET 核心编写的,我将寻找某种可维护的内部重写解决方案。
由于配置的这一部分,正在重写:
- match:
- uri:
prefix: /service-a
rewrite:
uri: /
这导致匹配的前缀被替换为 rewrite.uri 属性.
的值示例1:(虚拟服务已激活)
Original: http://www.page.com/service-a/icon.jpg
^--------^
Rewritten: http://www.page.com/icon.jpg
示例2:(此虚拟服务已激活)
Original: http://www.page.com/service-a/service-a/icon.jpg
^--------^
Rewritten: http://www.page.com/service-a/icon.jpg
示例3:(此虚拟服务未激活,回退到其他虚拟服务,或默认路由,或returns 404的黑洞)
Original: http://www.page.com/icon.jpg
Rewriting: DOESN'T HAPPEN
对于重写,没有也不可能,这取决于您的服务。可以找到 Istio 的重写 props 文档 here
如果每个子域都有自己的服务,那么这是一个选项:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: istio
spec:
hosts:
- "service-a.domain.com"
gateways:
- istio-gateway
http:
- match:
- uri:
prefix: /
rewrite:
uri: /service-a
route:
- destination:
host: service-a.default.svc.cluster.local