"force me to always do this when I use extension mappings"
Uri extensions have nothing to do with HTTP or content negotation. The idea of server driven conneg is a client comes with a set of accept headers against a resource and the server can determine which representation best matches the clients preferences.
The server can also return a Content-Location header indicating the uri of the negotiated resource or redirect to it directly. That location is a bookmark to the specific representation that was returned allowing the client to refer to it directly in the future.
This prevents the client from having to know how to build up uris / locking the server down to a specific uri space.
- Client comes with an accept header of "image/png" to "contact/1".
- Server does conneg and sees that "image/png" is supported.
- Server returns client the image/png representation along with a Content-Location of "/contact/1.png".
- Client saves the link as a bookmark. User copies the link into their paint program and opens the image directly
In all of this exchange the client did not have to learn about which extensions were supported in the uri space. The server fed the client the uris which the client held on to for future use.
If you force the extensions, that means the clients have to know the accepted extensions of the sever. That semantic is not at all part of HTTP, yet accept headers are.