Using handle blocks makes the proxies mutually exclusive, and handle_path has built-in prefix stripping logic. Also you shouldn’t use those header_up lines, Caddy handles headers correctly by default for WebSockets.
But keep in mind when you’re stripping a path prefix before proxying: