Who knew that a simple thing like HTTP redirects would be so complicated? It turns out clients will just change POST to GET on 301 (Postman, curl, everyone?), same with 302 which really behaves like 303 and that is also an old implementation "bug". Yeah, seriously.
If you have a REST API with POST (or other non-GET) request endpoints (who doesn't?) this behaviour will completely destroy everything. Many guides (top google results) out there for configuring Apache redirect do not mention this problem. The code of choice would be 308 Permanent Redirect but that is fairly new so I would not risk it, older clients don't know it exists. The only thing left is 307 which does not allow changing methods on redirect – exactly how it should be.
<VirtualHost *:80> ServerName example.com Redirect 307 / https://example.com/ </VirtualHost>