My server redirects requests to a single front-end controller. Should it contain enough logic for mapping requests to different controllers based on version, or should the controller handle this logic?
This is very much dependent on the way your application is written. If the exact same application handles everything and it is all build under a single global controller then the application should handle version routing but if you have several separate applications based on which version they are then the server should handle routing to the appropriate controller based on version.
As a side note best practice is to have the application decoupled by version so that the server routes to the appropriate application based on version and then the application takes over from there.