The two dimensions
Permanence tells the client whether to remember the answer. Method preservation tells it whether a POST stays a POST.
- 301 permanent, method may be changed to GET by the client.
- 302 temporary, method may be changed to GET by the client.
- 307 temporary, method preserved.
- 308 permanent, method preserved.
The method rewriting on 301 and 302 was not in the original specification. It was what browsers actually did, and it was later accepted as reality, which is why 307 and 308 exist at all.
Permanent means the browser stops asking
This is the part that catches people out. A permanent redirect can be cached by the browser, and there is no reliable way to tell a browser to forget it.
If you serve a 301 and later change the destination, anyone whose browser cached the first answer keeps going to the old place. They never touch your server, so nothing you do reaches them. Clearing it requires them to clear their own cache, which they will not do because they do not know anything is wrong.
For a link whose whole purpose is to be repointed, that is disqualifying.
Which an editable link should use
Temporary. The destination is expected to change, so the client should ask each time.
The usual objection is search engine ranking: a 301 passes signals to the destination and a 302 traditionally did not. In practice, search engines have been treating consistent 302 redirects as permanent for years, and a short link is usually not the canonical URL of anything anyway.
Digily Link uses a temporary redirect for short links, which is the right default for something you can edit.
When permanent is genuinely correct
When the move really is permanent and you would be happy for a client to never ask again.
- Retiring an old domain in favour of a new one, where the old address will never be reused.
- Consolidating duplicate URLs on the same site into a canonical one.
- Removing a URL pattern you have committed publicly to never bringing back.
Everything else, including anything with the word campaign in it, should be temporary. The cost of being wrong is asymmetric: a temporary redirect that should have been permanent is a minor inefficiency, while a permanent one that should have been temporary is unfixable.
When method preservation matters
Almost never for a link somebody clicks, because that is a GET already.
It matters for API endpoints and form posts, where a 302 that rewrites a POST into a GET silently drops the body. If you are redirecting anything non idempotent, use 307 or 308 and be deliberate about it.
For short links in documentation, marketing or print, this dimension does not come up.
Checking what you actually serve
One command answers this. Request the link with a client that does not follow redirects and read the status and Location header.
Do it after any change to your redirect configuration, because this is exactly the sort of thing that gets altered by a proxy, a CDN rule or a framework default without anybody noticing.
The failure mode is invisible from a browser, which follows the redirect and shows you the destination either way.