Эти две строки:
RewriteCond %{QUERY_STRING} ^p=([0-9]*)
RewriteRule ^ http://www.test.com/?p=%1&preview=true [R=301,L]
Строка запроса начинается с числового значения в качестве цели, на которую нужно перенаправить сообщение, поэтому она будет переписываться все больше и больше, и вы можете быть более конкретным, как вы указали в вопросе, добавив $
к ^p=([0-9]*)$
быть отделенным от нового. измените свои правила следующим образом:
RewriteCond %{QUERY_STRING} ^p=([0-9]*)$
RewriteRule ^ http://www.test.com/?p=%1&preview=true [R=301,L]
Если это не нормально, и вам нужно сопоставить эту строку запроса перед тем, как какое-либо правило переписывания, просто поставьте ее перед этим конкретным шагом.
Примечание: очистить кеш браузера и протестировать