Bence direk linklerinizi değiştirmeyin. Benim bir süredir kafamda olan ama bi türlü uygulamaya zaman bulamadığım bi düşünce var.

Farklı PHP dosyaları kullanıyorsanız (A sayfası için a.php, B sayfası için B.php gibi), her dosyaya include veya require metoduyla aldığınız PHP dosyasına; her şeyi index.php'den görüntülüyorsanız (A sayfası için index.php?case=a gibi), index.php'nin ilk satırlarında makul bir yere yönlendirme koyun. Örnek olarak:

Farklı dosyalar kullananlar için:
$siteurl = 'http://site.com/'; // Alt klasör olsa bile sadece .com'a kadar yazın
$siteurl2 = 'http://site.com/forum'; // Alt klasörlerinizi de belirtin.
$url = $siteurl . $_SERVER['REQUEST_URI'];

$adres = $siteurl2;

if($settings['sef_redirect'] == '1' && similar_text($url, '.html') == 0) // Ayarlar modülünüz varsa böyle bir şey yapabilirsiniz
{
   preg_match('/(.+)\.php/si', $adres, $dosya);
   $dosya == $dosya[0];
   $adres = $dosya . '.html' . !empty($_GET) ? '?' : '';

   foreach($_GET as $g => $v)
   {
      $adres .= $g . '=' . $v . '&';
   }

   $adres = substr($adres, 0, -1);
}

if(!empty($adres) && $adres != $siteurl2)
   header('location: ' . $adres);
Tek dosya kullananlar için:
$siteurl = 'http://site.com/'; // Alt klasör olsa bile sadece .com'a kadar yazın
$siteurl2 = 'http://site.com/forum/'; // Alt klasörlerinizi de belirtin.
$url = $siteurl . $_SERVER['REQUEST_URI'];

$adres = $siteurl2;

if($settings['sef_redirect'] == '1' && similar_text($url, '.html') == 0 && $_GET['case'] != '') // Ayarlar modülünüz yoksa $settings['sef_redirect'] değişkenini silebilir veya istediğiniz gibi değiştirebilirsiniz. // $_GET['case'] değişkenini sisteminize göre değiştirebilirsiniz
{
   preg_match('/index\.php\?case=(.+)/si', $adres, $dosya);
   $dosya == $dosya[0];
   $adres .= $dosya . '.html' . !empty($_GET) ? '?' : '';

   foreach($_GET as $g => $v)
   {
      $adres .= $g . '=' . $v . '&';
   }

   $adres = substr($adres, 0, -1);
}
elseif($settings['sef_redirect'] == '1' && similar_text($url, '.html') == 0 && $_GET['case'] == '') // Üstteki IF'ten tek farkı $_GET['case'] değişkenini boş istiyoruz bu sefer.
   $adres .= 'index.html';

if(!empty($adres) && $adres != $siteurl2)
   header('location: ' . $adres);