{"id":"75136e066255c48f","repo":"labstack/echo","slug":"echo-rewrite-middleware-requires-url-path-rewrite","errorCode":null,"errorMessage":"echo rewrite middleware requires url path rewrite rules or regex rules","messagePattern":"echo rewrite middleware requires url path rewrite rules or regex rules","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"middleware/rewrite.go","lineNumber":59,"sourceCode":"\tc := RewriteConfig{}\n\tc.Rules = rules\n\treturn RewriteWithConfig(c)\n}\n\n// RewriteWithConfig returns a Rewrite middleware or panics on invalid configuration.\n//\n// Rewrite middleware rewrites the URL path based on the provided rules.\nfunc RewriteWithConfig(config RewriteConfig) echo.MiddlewareFunc {\n\treturn toMiddlewareOrPanic(config)\n}\n\n// ToMiddleware converts RewriteConfig to middleware or returns an error for invalid configuration\nfunc (config RewriteConfig) ToMiddleware() (echo.MiddlewareFunc, error) {\n\tif config.Skipper == nil {\n\t\tconfig.Skipper = DefaultSkipper\n\t}\n\tif config.Rules == nil && config.RegexRules == nil {\n\t\treturn nil, errors.New(\"echo rewrite middleware requires url path rewrite rules or regex rules\")\n\t}\n\n\tif config.RegexRules == nil {\n\t\tconfig.RegexRules = make(map[*regexp.Regexp]string)\n\t}\n\tmaps.Copy(config.RegexRules, rewriteRulesRegex(config.Rules))\n\n\treturn func(next echo.HandlerFunc) echo.HandlerFunc {\n\t\treturn func(c *echo.Context) (err error) {\n\t\t\tif config.Skipper(c) {\n\t\t\t\treturn next(c)\n\t\t\t}\n\n\t\t\tif err := rewriteURL(config.RegexRules, c.Request()); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn next(c)\n\t\t}","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/labstack/echo/blob/05489dc1730161df26b72d1ae2a3ba6fb8178fc7/middleware/rewrite.go#L41-L77","documentation":"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.","triggerScenarios":"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).","commonSituations":"Developer builds rules conditionally and the branch leaves the map nil; or intends to use RegexRules only but forgets to initialise it.","solutions":["Provide Rules, e.g. Rewrite(map[string]string{\"/old/*\": \"/$1\"}).","If you only have compiled regexps, set RegexRules: map[*regexp.Regexp]string{re: \"/v2/$1\"}.","When building rules dynamically, initialise the map even if it may be empty: make(map[string]string).","Call config.ToMiddleware() to get the error returned rather than panicked."],"exampleFix":"// before\nm := middleware.RewriteWithConfig(middleware.RewriteConfig{})\n// after\nm := middleware.RewriteWithConfig(middleware.RewriteConfig{\n    Rules: map[string]string{\"/old/*\": \"/$1\"},\n})","handlingStrategy":"validation","validationCode":"func rewriteMiddleware(rules map[string]string) (echo.MiddlewareFunc, error) {\n    cfg := middleware.RewriteConfig{Rules: rules}\n    if cfg.Rules == nil && cfg.RegexRules == nil {\n        return nil, errors.New(\"Rewrite requires Rules or RegexRules\")\n    }\n    return cfg.ToMiddleware()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Provide at least one rule: Rewrite(map[string]string{\"/old/*\": \"/$1\"}).","When building rules dynamically, initialise the map with make(map[string]string) even if it may stay empty.","Use cfg.ToMiddleware() to receive the error instead of a startup panic."],"tags":["middleware","rewrite","config","panic","startup"],"analyzedSha":"05489dc1730161df26b72d1ae2a3ba6fb8178fc7","analyzedAt":"2026-08-04T21:32:47.783Z","schemaVersion":2}