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

  1. Correct the `for` glob in the `[[server.headers]]` entry quoted by the error — balance `[]` and `{}` groups.
  2. Use glob syntax (`*`, `**`, `{a,b}`), not regular expressions, e.g. `for = "/**"` to match all paths.
  3. 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

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


AI-assisted analysis of gohugoio/hugo@8a468df065 (2026-07-31). Data as JSON: /data/errors/aeec5cc254cf328b.json. Report an issue: GitHub ↗.