You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
compose-model-service puts URLRewrite filter under backendRef, breaking the data path #85
Every request through a ModelService returns HTTP 500 from the control plane gateway. The model serving pod on the workload cluster is healthy and never receives the request.
compose-model-service builds an HTTPRoute that attaches a URLRewrite filter to each backendRef:
The Gateway API spec only allows RequestHeaderModifier and ResponseHeaderModifier at the backendRef level. URLRewrite is a rule-level-only filter. Envoy Gateway rejects the route accordingly:
status:
parents:
- conditions:
- type: ResolvedRefs
status: "False"
reason: UnsupportedRefValue
message: Specific filter is not supported within BackendRef, only
RequestHeaderModifier and ResponseHeaderModifier are supported
With the route unresolved, Envoy emits a direct_response for every matching request:
The function comment says per-backend filters are intentional, to support endpoints with different rewritePath values:
Each backendRef carries its own URLRewrite filter so endpoints with different rewritePaths (e.g. composed replicas vs. external SaaS providers) are rewritten correctly per-backend.
But Gateway API doesn't allow this shape.
How can we reproduce it?
Walk through docs/getting-started.md to deploy qwen-demo on GKE. Once ModelDeployment reports READY=True, hit the endpoint:
The root cause here is that a ModelService backed by endpoints with different path conventions (e.g. a composed endpoint serving at /v1/... alongside an external provider like Groq at /openai/v1/...) needs per-backend URL rewriting within a single weighted traffic split.
The Gateway API spec supports this — URLRewrite is listed as an Extended feature at the HTTPBackendRef level. The fix would be to move the URLRewrite filter from the rule level into each backendRef:
Envoy Gateway can't do this. It only supports RequestHeaderModifier and ResponseHeaderModifier at the backendRef level. Per-backend path rewriting is blocked on Envoy itself — WeightedCluster.ClusterWeight in Envoy's route proto doesn't support prefix_rewrite. See envoyproxy/gateway#7099 and envoyproxy/gateway#7020 (both open, no timeline). The original tracking issue for backendRef filter support (envoyproxy/gateway#2572) was closed after header modification was shipped, but path rewrite support was explicitly deferred pending upstream Envoy changes.
Activity
Move URLRewrite filter from backendRef to rule level
negz commentedon May 27, 2026
The root cause here is that a
ModelServicebacked by endpoints with different path conventions (e.g. a composed endpoint serving at/v1/...alongside an external provider like Groq at/openai/v1/...) needs per-backend URL rewriting within a single weighted traffic split.The Gateway API spec supports this —
URLRewriteis listed as an Extended feature at theHTTPBackendReflevel. The fix would be to move theURLRewritefilter from the rule level into eachbackendRef:Envoy Gateway can't do this. It only supports
RequestHeaderModifierandResponseHeaderModifierat thebackendReflevel. Per-backend path rewriting is blocked on Envoy itself —WeightedCluster.ClusterWeightin Envoy's route proto doesn't supportprefix_rewrite. See envoyproxy/gateway#7099 and envoyproxy/gateway#7020 (both open, no timeline). The original tracking issue for backendRef filter support (envoyproxy/gateway#2572) was closed after header modification was shipped, but path rewrite support was explicitly deferred pending upstream Envoy changes.