labstack/echo · error

echo rewrite middleware requires url path rewrite rules or r

Error message

echo rewrite middleware requires url path rewrite rules or regex rules

What it means

Returned by RewriteConfig.ToMiddleware when both Rules and RegexRules are nil. The middleware has no purpose without at least one rewrite rule; an empty-but-non-nil map is accepted (it simply rewrites nothing), only a totally nil config is rejected.

Source

Thrown at middleware/rewrite.go:59

	c := RewriteConfig{}
	c.Rules = rules
	return RewriteWithConfig(c)
}

// RewriteWithConfig returns a Rewrite middleware or panics on invalid configuration.
//
// Rewrite middleware rewrites the URL path based on the provided rules.
func RewriteWithConfig(config RewriteConfig) echo.MiddlewareFunc {
	return toMiddlewareOrPanic(config)
}

// ToMiddleware converts RewriteConfig to middleware or returns an error for invalid configuration
func (config RewriteConfig) ToMiddleware() (echo.MiddlewareFunc, error) {
	if config.Skipper == nil {
		config.Skipper = DefaultSkipper
	}
	if config.Rules == nil && config.RegexRules == nil {
		return nil, errors.New("echo rewrite middleware requires url path rewrite rules or regex rules")
	}

	if config.RegexRules == nil {
		config.RegexRules = make(map[*regexp.Regexp]string)
	}
	maps.Copy(config.RegexRules, rewriteRulesRegex(config.Rules))

	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c *echo.Context) (err error) {
			if config.Skipper(c) {
				return next(c)
			}

			if err := rewriteURL(config.RegexRules, c.Request()); err != nil {
				return err
			}
			return next(c)
		}

View on GitHub (pinned to 05489dc173)

Solutions

  1. Provide Rules, e.g. Rewrite(map[string]string{"/old/*": "/$1"}).
  2. If you only have compiled regexps, set RegexRules: map[*regexp.Regexp]string{re: "/v2/$1"}.
  3. When building rules dynamically, initialise the map even if it may be empty: make(map[string]string).
  4. Call config.ToMiddleware() to get the error returned rather than panicked.

Example fix

// before
m := middleware.RewriteWithConfig(middleware.RewriteConfig{})
// after
m := middleware.RewriteWithConfig(middleware.RewriteConfig{
    Rules: map[string]string{"/old/*": "/$1"},
})
Defensive patterns

Strategy: validation

Validate before calling

func rewriteMiddleware(rules map[string]string) (echo.MiddlewareFunc, error) {
    cfg := middleware.RewriteConfig{Rules: rules}
    if cfg.Rules == nil && cfg.RegexRules == nil {
        return nil, errors.New("Rewrite requires Rules or RegexRules")
    }
    return cfg.ToMiddleware()
}

Prevention

When it happens

Trigger: Calling RewriteWithConfig(RewriteConfig{}) with neither Rules nor RegexRules set, or Rewrite(nil) (note: Rewrite(map[string]string{}) with an initialised empty map would NOT trigger this).

Common situations: Developer builds rules conditionally and the branch leaves the map nil; or intends to use RegexRules only but forgets to initialise it.

Related errors


AI-assisted analysis of labstack/echo@05489dc173 (2026-08-04). Data as JSON: /data/errors/75136e066255c48f.json. Report an issue: GitHub.