我们可以为 traefik v2 中的中间件设置优先级吗?
Can we set priority for the middlewares in traefik v2?
在 kubernetes 中使用 v1.7.9 我遇到了这个问题:
如果我设置速率限制 (traefik.ingress.kubernetes.io/rate-limit
) 和自定义响应 headers (traefik.ingress.kubernetes.io/custom-response-headers
) 那么当请求受到速率限制时,自定义 headers 将不会'不定。我想这是因为这些插件中的一些ordering/priority。我完全同意达到 rate-limit 应该 return 尽快做出响应,但是如果我们可以根据需要修改优先级,那就太好了。
因此问题是:我们可以为中间件设置优先级吗?
我在 github 问题中找不到任何线索 in the docs。
具体use-case:
我希望 CORS-policy headers 始终被设置,即使 rate-limiting 启动了。我想要这个是因为我的 SPA 不会得到响应 object 否则,因为浏览器不允许:
Access to XMLHttpRequest at 'https://api.example.com/api/v1/resource' from origin 'https://cors.exmaple.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
在这种情况下,如果我可以设置 headers middleware higher than the rate limit middleware 的优先级,那将是一个很好的解决方案。
普通网页可以使用 XMLHttpRequest object 从远程服务器发送和接收数据,但它们受到同源策略的限制。扩展并不受此限制。扩展程序可以与其来源之外的远程服务器通信,只要它首先请求 cross-origin 权限。
1. 尝试在您的本地机器上进行测试,将 localhost 替换为您的本地 IP。您必须通过以下代码行实现 CORS request.withCredentials = true;其中 request 是 XMLHttpRequest 的实例。必须将 CORS headers 添加到后端服务器以允许跨源访问。
2.你可以自己写脚本,负责在headers中间件之后执行限速中间件。
在v2中,中间件可以按你想要的顺序排列,你可以在同一条路由上多次放置同类型的不同配置的中间件。
为了将来参考,此处提供了一个演示此类排序的工作示例:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: ratelimit
spec:
rateLimit:
average: 100
burst: 50
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: response-header
spec:
headers:
customResponseHeaders:
X-Custom-Response-Header: "value"
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute
spec:
# more fields...
routes:
# more fields...
middlewares: # the middlewares will be called in this order
- name: response-header
- name: ratelimit
我在 Containous 的社区论坛上问了同样的问题:https://community.containo.us/t/can-we-set-priority-for-the-middlewares-in-v2/1326
在 kubernetes 中使用 v1.7.9 我遇到了这个问题:
如果我设置速率限制 (traefik.ingress.kubernetes.io/rate-limit
) 和自定义响应 headers (traefik.ingress.kubernetes.io/custom-response-headers
) 那么当请求受到速率限制时,自定义 headers 将不会'不定。我想这是因为这些插件中的一些ordering/priority。我完全同意达到 rate-limit 应该 return 尽快做出响应,但是如果我们可以根据需要修改优先级,那就太好了。
因此问题是:我们可以为中间件设置优先级吗?
我在 github 问题中找不到任何线索 in the docs。
具体use-case:
我希望 CORS-policy headers 始终被设置,即使 rate-limiting 启动了。我想要这个是因为我的 SPA 不会得到响应 object 否则,因为浏览器不允许:
Access to XMLHttpRequest at 'https://api.example.com/api/v1/resource' from origin 'https://cors.exmaple.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
在这种情况下,如果我可以设置 headers middleware higher than the rate limit middleware 的优先级,那将是一个很好的解决方案。
普通网页可以使用 XMLHttpRequest object 从远程服务器发送和接收数据,但它们受到同源策略的限制。扩展并不受此限制。扩展程序可以与其来源之外的远程服务器通信,只要它首先请求 cross-origin 权限。
1. 尝试在您的本地机器上进行测试,将 localhost 替换为您的本地 IP。您必须通过以下代码行实现 CORS request.withCredentials = true;其中 request 是 XMLHttpRequest 的实例。必须将 CORS headers 添加到后端服务器以允许跨源访问。
2.你可以自己写脚本,负责在headers中间件之后执行限速中间件。
在v2中,中间件可以按你想要的顺序排列,你可以在同一条路由上多次放置同类型的不同配置的中间件。
为了将来参考,此处提供了一个演示此类排序的工作示例:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: ratelimit
spec:
rateLimit:
average: 100
burst: 50
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: response-header
spec:
headers:
customResponseHeaders:
X-Custom-Response-Header: "value"
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute
spec:
# more fields...
routes:
# more fields...
middlewares: # the middlewares will be called in this order
- name: response-header
- name: ratelimit
我在 Containous 的社区论坛上问了同样的问题:https://community.containo.us/t/can-we-set-priority-for-the-middlewares-in-v2/1326