gohugoio/hugo · error
failed to compile Redirect header glob %q: %w
Error message
failed to compile Redirect header glob %q: %w
What it means
Raised by Server.CompileConfig when a value in a redirect's `fromHeaders` map fails glob.Compile. `fromHeaders` lets a redirect match only when request headers match given glob patterns (used e.g. for htmx-aware routing in `hugo server`); each header value pattern must be a valid glob.
Source
Thrown at config/commonConfig.go:284
}
if r.From != "" {
g, err := glob.Compile(r.From)
if err != nil {
return fmt.Errorf("failed to compile Redirect glob %q: %w", r.From, err)
}
rd.from = g
}
if r.FromRe != "" {
re, err := regexp.Compile(r.FromRe)
if err != nil {
return fmt.Errorf("failed to compile Redirect regexp %q: %w", r.FromRe, err)
}
rd.fromRe = re
}
for k, v := range r.FromHeaders {
g, err := glob.Compile(v)
if err != nil {
return fmt.Errorf("failed to compile Redirect header glob %q: %w", v, err)
}
rd.headers[k] = g
}
s.compiledRedirects = append(s.compiledRedirects, rd)
}
return nil
}
func (s *Server) MatchHeaders(pattern string) []types.KeyValueStr {
if s.compiledHeaders == nil {
return nil
}
var matches []types.KeyValueStr
for i, g := range s.compiledHeaders {
if g.Match(pattern) {View on GitHub ↗ (pinned to 8a468df065)
Solutions
- Fix the header-value glob quoted in the error under `fromHeaders` — balance brackets/braces.
- Use exact strings or simple globs (`*`) for header values, e.g. `HX-Request = "true"`.
- Remember header-value patterns are globs, not regexps — rewrite regexp constructs accordingly.
Example fix
# before (hugo.toml)
[[server.redirects]]
from = "/**"
to = "/partials{path}"
[server.redirects.fromHeaders]
HX-Request = "{true"
# after
[[server.redirects]]
from = "/**"
to = "/partials{path}"
[server.redirects.fromHeaders]
HX-Request = "true" Defensive patterns
Strategy: validation
Validate before calling
import "github.com/gobwas/glob"
for _, h := range r.Headers { // header keys on a redirect are globs
if _, err := glob.Compile(h.For); err != nil {
return fmt.Errorf("redirect header glob %q invalid: %w", h.For, err)
}
} Try / catch
if err := cfg.Server.CompileConfig(logger); err != nil {
// "failed to compile Redirect header glob" — a header matcher on a redirect entry is malformed
return err
} Prevention
- Header matchers attached to redirects are globs, same syntax as [server.headers].for
- Reuse an already-working glob from your headers config instead of hand-writing a new variant
- Validate the whole server block with a local `hugo server` run after any redirect/header edit
When it happens
Trigger: A `[[server.redirects]]` entry with a `[server.redirects.fromHeaders]` table whose value is malformed glob syntax, e.g. `HX-Request = "[tru"` (unbalanced bracket) or an unclosed brace group in the header-value pattern.
Common situations: Setting up htmx or content-negotiation redirects in the dev server and writing regexp syntax in header-value patterns; typos in patterns like `{true,1}` missing the closing brace; copying examples with smart quotes from docs or blogs.
Related errors
- failed to compile Headers glob %q: %w
- failed to compile Redirect glob %q: %w
- redirects must have either From or FromRe set
- failed to compile Redirect regexp %q: %w
- language %q not found
AI-assisted analysis of gohugoio/hugo@8a468df065 (2026-07-31).
Data as JSON: /data/errors/75c02ac8169199b2.json.
Report an issue: GitHub ↗.