Вы должны проверить, был ли это чистый запрос или нет.
В противном случае вы попадете в бесконечный цикл
Вот пример из одного из моих проектов:
.htaccess
RewriteEngine On
RewriteRule ^game/([0-9]+)/ /game.php?newid=$1
game.php
if (isset($_GET['id'])) {
$row = dbgetrow("SELECT * FROM games WHERE id = %s",$_GET['id']);
if ($row) {
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: /game/".$row['id']."/".seo_title($row['name']));
} else {
Header( "HTTP/1.1 404 Not found" );
}
exit;
}
if (isset($_GET['newid'])) $_GET['id'] = $_GET['newid'];
Итак, вы должны проверить, был ли это прямой «грязный» вызов или переписан.
А затем перенаправить только если прежний.
Вам также нужен код для создания чистого URL.
И очень важно показывать 404 вместо перенаправления в случае неправильного URL.