Okay, so if a visitor requests /videos then you want the request to be silently rewritten to the actual path /page.php?id=1 so that you can advertise the "clean" URL /videos and hide the query string ugliness.
But you also want to force a visitor who actually requests /page.php?id=1 to be permanently redirected to the "clean" URL /videos so that they get the message that query string ugliness is no longer for their eyes.
The problem is that even rewritten requests have to run through your Apache directives all over again, which means that clean will rewrite to actual, which will then redirect to clean, which will rewrite to actual, and so on infinitely. Which is why you're getting a fatal error.
The only way to break this loop is to change the actual path or insert a dummy variable which allows the RewriteEngine to stop once the rewrite has been done once.
For example, you could use the following:
RewriteCond %{QUERY_STRING} !&redirect=done$
RewriteCond %{QUERY_STRING} ^id=1
RewriteRule /page.php /videos [R=permanent]
RewriteRule /videos /page.php?id=1&redirect=done
This will always silently rewrite /videos to /page.php?id=1&redirect=done, but it will only redirect /page.php to /videos if the request for page.php does not have a query string which ends with redirect=done
(and also does have a query string which begins with id=1
).
It's convoluted, but it's the only way I can think to break the infinite loop.