Это лучше сделать в вашем файле .htaccess, чем в PHP;и знаменитая цитата Джейми Завински о наличии двух проблем, если использовать в уме пружины регулярных выражений.Вам нужно минимальное регулярное выражение для .htaccess и ни одного вообще для PHP.
RewriteCond $1 !^(archives|search)
RewriteRule blog/(.*) http://www.my-site.com/blog/article/$1 [R=301]
Или, если у вас есть RedirectMatch
, вы можете комбинировать его с отрицательным прогнозом, как уже предлагалось:
RedirectMatch permanent blog/((?!archives|search).+) http://www.my-site.com/blog/article/$1
Если вам нужно использовать PHP:
$urlparts = explode('/', $_SERVER['REQUEST_URI']);
if ( ! in_array($urlparts[1], array('archives', 'search')) ) {
$url = 'http://www.my-site.com/blog/article/' . $urlparts[2]
header('HTTP/1.1 301 Moved Permanently');
header("Location: $url");
exit;
}
Как вы можете видеть, в PHP все гораздо сложнее и требует запуска интерпретатора для выполнения действий, которые мог бы выполнить сервер, поэтому избегайте этого, еслиу вас есть возможность.