在Istio网关上使用URL重写时用于资源的HTTP404

时间:2019-01-03 13:17:15

标签: url-rewriting istio

我正在尝试将服务部署到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 /图像文件。该页面尝试加载的所有内容仍然具有原始网址,而我的网关配置未进行任何重写。因此主页要求:

http://xxxxx.europe.cloudapp.azure.com/icon.jpg

代替此:

http://xxxxx.europe.cloudapp.azure.com/service-a/icon.jpg

处理页面上资源和链接的URL的最佳方法是什么?我必须手动更改主页上的网址吗?

编辑:

更清楚

  1. URL的重写按预期工作,地址正是我想要的(整个服务都隐藏在“ xxxx.europe.cloudapp.azure.com/service-a”下。
  2. 一旦我输入“ xxxx.europe.cloudapp.azure.com/service-a”,我就会看到该服务的欢迎页面,但未加载任何CSS / JPEG / JS。此外,欢迎页面上可见的链接也无效。
  3. 例如,未加载“ icon.jpg”。 Page希望从http://xxxx.europe.cloudapp.azure.com/icon.jpg加载它,但现在不存在了。由于需要重写,因此可以按预期在http://xxxx.europe.cloudapp.azure.com/service-a/icon.jpg上使用它。

我有点希望http://xxxx.europe.cloudapp.azure.com/icon.jpg请求将自动重写为http://xxxx.europe.cloudapp.azure.com/service-a/icon.jpg。但是很明显我误会了。所以我想知道如何以一种可管理的方式处理服务本身中的链接-我的意思是我可以修改应用程序中的每个可能链接,但是如果我们再次更改url(从/ service-a到/ service-b),该怎么办? 。该服务是用ASP.NET Core编写的,我将寻找某种可维护的内部重写解决方案。

1 个答案:

答案 0 :(得分:3)

由于配置的这一部分,正在进行重写:

Original: http://www.page.com/service-a/icon.jpg
                             ^--------^
Rewritten: http://www.page.com/icon.jpg

将匹配的前缀替换为 rewrite.uri 属性的值。

示例1:(虚拟服务已激活)

Original: http://www.page.com/service-a/service-a/icon.jpg
                             ^--------^
Rewritten: http://www.page.com/service-a/icon.jpg

示例2:(此虚拟服务已激活)

Original: http://www.page.com/icon.jpg

Rewriting: DOESN'T HAPPEN

示例3:(此虚拟服务未激活,回退到某些其他虚拟服务,默认路径或返回404的黑洞)

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

要重写,没有建议,也不能做到,这取决于您的服务。可以在here

中找到Istio的重写道具文档

如果每个子域都将拥有自己的服务,则可以选择以下方式:

{{1}}