We do a combination of path and data schema versioning.
GET /v1/user will return a data schema object or document which itself contains a version.
{
"version": "1",
"etc": { ... }
}
For caching we also use X-header tags too (cache busting is a pain).
The root of all evil is not how to do versioning, it's more about how to describe demand for a specific version of a resource or data.
Recently we've started to use raml.org/ but so far we have no experiences to share yet.