tailscale/tailscale · error
CSRF request denied with mismatched Origin %q and Host %q
Error message
CSRF request denied with mismatched Origin %q and Host %q
What it means
Returned as HTTP 403 by the CSRF middleware when the Origin host differs from the request Host (or the configured origin override). This is the actual cross-site detection; reverse proxies without the override set commonly trigger it.
Source
Thrown at client/web/web.go:292
originHeader := r.Header.Get("Origin")
if originHeader == "" {
http.Error(w, "CSRF request denied with no Origin header", http.StatusForbidden)
return
}
parsedOrigin, err := url.Parse(originHeader)
if err != nil {
http.Error(w, fmt.Sprintf("CSRF request denied with invalid Origin %q", r.Header.Get("Origin")), http.StatusForbidden)
return
}
origin := parsedOrigin.Host
if origin == "" {
http.Error(w, "CSRF request denied with no host in the Origin header", http.StatusForbidden)
return
}
if origin != host {
http.Error(w, fmt.Sprintf("CSRF request denied with mismatched Origin %q and Host %q", origin, host), http.StatusForbidden)
return
}
h.ServeHTTP(w, r)
})
}
func (s *Server) modeAPIHandler(mode ServerMode) (http.Handler, string) {
switch mode {
case LoginServerMode:
return http.HandlerFunc(s.serveLoginAPI), "web_login_client_initialization"
case ReadOnlyServerMode:
return http.HandlerFunc(s.serveLoginAPI), "web_readonly_client_initialization"
case ManageServerMode:
return http.HandlerFunc(s.serveAPI), "web_client_initialization"
default: // invalid mode
log.Fatalf("invalid mode: %v", mode)View on GitHub (pinned to 6e0912f979)
Solutions
- Access the web client via the same host as served (or the Tailscale IP)
- Configure originOverride when reverse-proxying under a different hostname
- Fix proxy header rewriting so Origin and Host agree
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at client/web/web.go:292 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18).
Data as JSON: /api/errors/090cb8c06f5ea367.
Report an issue: GitHub.