使用部署到Azure Service Fabric的Traefik版本1.7.12。
我希望Traefik将缓存控制标头添加到来自Web应用程序的某些请求的响应,该Web应用程序也已部署到集群。我发现可以完成此操作的方法是为我的应用程序创建2个具有不同前端路由规则的单独服务。最终结果将是这样的:
Route Rule
Host:devmachine.localhost;PathPrefix:/
添加“ cache-control:no-cache”响应头。
和
Route Rule
Host:devmachine.localhost;Path:/{url:(.*)(/banner$|\.(js|css)\??)}
添加“ cache-control:max-age:86400”响应头。
分别是集群中每个服务清单的摘录:
<Extensions>
<Extension Name="Traefik">
<Labels xmlns="http://schemas.microsoft.com/2015/03/fabact-no-schema">
<Label Key="traefik.enable">true</Label>
<Label Key="traefik.frontend.passHostHeader">true</Label>
<Label Key="traefik.frontend.rule">Host:devmachine.localhost;PathPrefix:/</Label>
<Label Key="traefik.backend.loadbalancer.stickiness">true</Label>
<Label Key="traefik.backend.healthcheck.path">/somepage</Label>
<Label Key="traefik.backend.healthcheck.interval">60s</Label>
<label key="traefik.frontend.headers.customResponseHeaders">cache-control:no-cache</label>
</Labels>
</Extension>
</Extensions>
和
<Extensions>
<Extension Name="Traefik">
<Labels xmlns="http://schemas.microsoft.com/2015/03/fabact-no-schema">
<Label Key="traefik.enable">true</Label>
<Label Key="traefik.frontend.passHostHeader">true</Label>
<Label Key="traefik.frontend.rule">Host:devmachine.localhost;Path:/{url:(.*)(/banner$|\\.(js|css)\\??)}</Label>
<label key="traefik.frontend.headers.customResponseHeaders">cache-control:max-age=86400</label>
<label key="traefik.frontend.priority">200</label>
</Labels>
</Extension>
</Extensions>
问题是我所有的响应都得到“ no-cache”报头,好像没有应用第二个匹配器,包括以下示例URI(应该由第二个路由规则处理):
https://example.com/banner
https://example.com/scripts/some.js
https://example.com/scripts/some-hdbxy778.js
https://example.com/scripts/someother.js?v=2.744
尽管事实上第二路由规则更长(因为traefik应该按照长度降序对它们进行排序,并且手动设置了优先级(200)。
这原来是套管问题。 traefik中的Service Fabric提供程序使用“ xml.Unmarshal”将扩展配置反序列化为本地类型。
根据文档(https://golang.org/pkg/encoding/xml/#Unmarshal)
Unmarshal使用区分大小写的比较来匹配XML元素名称标记值和结构字段名称。
这有道理。
Traefik的文档已更新,以指出这一点:https://github.com/containous/traefik/pull/5160