An internal rewrite serves another resource under the same URL, and the browser never knows. An external redirect answers 3xx with a Location header, and the browser asks again. An alias (Alias, mod_alias) publishes a directory outside DocumentRoot and is not allowed in .htaccess; Redirect and RedirectMatch are. The manual ("When NOT to use mod_rewrite") prefers mod_alias whenever it suffices (Redirect and RedirectMatch); mod_rewrite is for decisions that depend on more than the path. Never let both act on one URL:
RewriteEngine On
Redirect 301 /old-page /new-page
RewriteRule ^old-page$ show.php?from=rewrite [L]
RewriteRule ^about$ show.php?page=about [L]
RewriteRule ^contact$ /show.php?page=contact [R=302,L]$ t /about /contact /old-page
/about 200 {"page":"about"}
/contact 302 http://example.com/show.php?page=contact
/old-page 301 http://example.com/new-page?from=rewrite/about reached show.php while the address bar keeps /about. /old-page is the clash: in .htaccess both modules act in the late fixup phase, the rewrite ran first and replaced the query string, and Redirect then fired on the original path and carried the rewritten query along. In a virtual host, mod_rewrite acts earlier, at URL translation.