gohugoio/hugo · error
failed to compile Headers glob %q: %w
Error message
failed to compile Headers glob %q: %w
What it means
Raised by Server.CompileConfig when compiling the dev-server `server.headers` configuration. Each Headers entry has a `for` field that must be a valid glob (compiled with gobwas/glob); if glob.Compile fails, Hugo aborts config loading with this error naming the bad pattern.
Source
Thrown at config/commonConfig.go:256
}
func (r redirect) matchHeader(header http.Header) bool {
for k, v := range r.headers {
if !v.Match(header.Get(k)) {
return false
}
}
return true
}
func (s *Server) CompileConfig(logger loggers.Logger) error {
if s.compiledHeaders != nil {
return nil
}
for _, h := range s.Headers {
g, err := glob.Compile(h.For)
if err != nil {
return fmt.Errorf("failed to compile Headers glob %q: %w", h.For, err)
}
s.compiledHeaders = append(s.compiledHeaders, g)
}
for _, r := range s.Redirects {
if r.From == "" && r.FromRe == "" {
return fmt.Errorf("redirects must have either From or FromRe set")
}
rd := redirect{
headers: make(map[string]glob.Glob),
}
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 != "" {View on GitHub ↗ (pinned to 8a468df065)
Solutions
- Correct the `for` glob in the `[[server.headers]]` entry quoted by the error — balance `[]` and `{}` groups.
- Use glob syntax (`*`, `**`, `{a,b}`), not regular expressions, e.g. `for = "/**"` to match all paths.
- Validate the pattern against gobwas/glob syntax if using advanced alternation.
Example fix
# before (hugo.toml)
[[server.headers]]
for = "/{css,js"
[server.headers.values]
Cache-Control = "no-store"
# after
[[server.headers]]
for = "/{css,js}/**"
[server.headers.values]
Cache-Control = "no-store" Defensive patterns
Strategy: validation
Validate before calling
import "github.com/gobwas/glob"
for _, h := range cfg.Server.Headers {
if _, err := glob.Compile(h.For); err != nil {
return fmt.Errorf("bad server.headers 'for' glob %q: %w", h.For, err)
}
} Try / catch
if err := cfg.Server.CompileConfig(logger); err != nil {
// surfaces "failed to compile Headers glob" — fix [server.headers].for value
return err
} Prevention
- Remember [server.headers].for takes a glob (e.g. `/**`), not a regexp
- Avoid unbalanced `[`, `{` in glob patterns — these are the usual compile failures
- Run `hugo server` locally once after editing server config; the error appears at startup, not per-request
When it happens
Trigger: Running `hugo server` (or building with server config compiled) with a `[[server.headers]]` block whose `for` pattern is malformed glob syntax — e.g. unbalanced brackets `for = "/[abc"`, an unclosed brace group `for = "/{a,b"`, or a stray `\` escape.
Common situations: Writing regexp syntax in the `for` field where a glob is expected; copying Netlify-style path patterns; typos in brace alternation like `/{css,js` when adding custom headers (CSP, CORS) for local development.
Related errors
- failed to compile Redirect header 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/aeec5cc254cf328b.json.
Report an issue: GitHub ↗.