Тема: Redirect .htaccess на ЧПУ (регулярное выражение)

Переехал на ЧПУ. Меня раздражает факт того, что ссылки с чужих сайтов отправляют пользователей на старые страницы сайта ( типа: ... /main.php?id=33) т.е. без ЧПУ.

Это не красиво и ПС плохо такое хавают. Я помыкался-потыкался и ничего не смог написать - просто не могу взять в толк как это ЧПУ работает.

Помогите, пожалуйста, написать регулярное выражение для .htaccess, чтобы осуществлять 301 редирект со старых адресов ( ... /main.php?id=33 ) на новые (с ЧПУ).

За любую помощь буду признателен.
Ссылки на полезное чтиво тоже считаются...

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

http://www.htaccesstools.com/
http://mgcorp.ru/server/htaccess.html
http://forum.aeweb.ru/thread127.html
http://generateit.net/mod-rewrite/

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

Я смотрел уже базовые маны и примеры....
Как сделать переадресацию с одной конкретной ссылки на другую - понятно.
Как сделать переадресацию с одной типовой ссылки (... main.php ...) на другую конкретную ссылку - тоже понятно.
Не понятно как это засунуть в ЧПУ, чтобы с одной конкретной ссылки (...main.php?id=33) осуществлялась переадресация на эту же новость с ЧПУ.

Т.е. вроде бы ясно, что надо написать выражение, которое будет включать в себя и RewriteRule и Redirect permanent. У меня эти 2 правила сочетать не получается... Или я не так всё понимаю?

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

ну первое, что мне кажется, нужно отказаться от htaccess в данном случае.
Идем верстать в РНР!
Первое что бы сделал я - так это определил - а есть ли в ссылке id.
И сделал бы это примерно так:

if (!empty($_GET['id']) and is_numeric($_GET['id'])) {
// тут остальной еще не придуманный код...
}

Если у вас классический транслит от заголовков новостей для чпу - то код выше это просто офигительный помошник на первом этапе.

пойдем дальше.

if (!empty($_GET['id']) and is_numeric($_GET['id'])) {
$url_id = $_GET['id'];
// теперь как бэ нам надо получить тот самый классический урл-транслит от заголовка новости.
// примерно организовываем это так:
            $c_url = reset($sql->select(array('table' => 'news', 'where' => array("id = $url_id"))));
$cl_url = (!empty($c_url['url']) ? $c_url['url'] : $c_url['id']);
// ну вот и получили мы заветный url? но нам то надо в чпу это все забацать!


    foreach (($rufus_file ? $rufus_file : parse_ini_file(rufus_file, true)) as $type_k => $type_v){
        if (is_array($type_v)){
            foreach ($type_v as $k => $v){
                if ($type_k == 'home'){
                    $rlink['rlink'][$k] = cute_get_link($c_url, $k);
                }

                $rlink['rlink'][$type_k.'/'.$k] = cute_get_link($c_url, $k, $type_k);
            }
        }
    }

// после чего делаем наш мега редирект:
header('HTTP/1.1 301 Moved Permanently'); // чоб роботы кончали от удовольствия
@header('Location: '.$rlink['rlink']['post']); // чоб человек попал куда надо, ночью без фонарика прям ))

}

Однако, и естественно, я не тестировал - проверте что выдает переменная $rlink['rlink']['post']. Я к тому, что подставляется ли туда адрес самого сайта - или это ссылка относительная...

2 минуты и 28 секунд спустя:

это хозяйство все подставить куда нибудь после подключения head.php

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

Код рабочий. Спасибо большое Miksar!
Только $_GET['id'] добавить скобочку.
---------------------------------------------------------------
Должен признаться, что вот эту часть кода я не понял:

    foreach (($rufus_file ? $rufus_file : parse_ini_file(rufus_file, true)) as $type_k => $type_v){
        if (is_array($type_v)){
            foreach ($type_v as $k => $v){
                if ($type_k == 'home'){
                    $rlink['rlink'][$k] = cute_get_link($c_url, $k);
                }

                $rlink['rlink'][$type_k.'/'.$k] = cute_get_link($c_url, $k, $type_k);
            }
        }
    }

----------------------------------------------
Наверно поэтому у меня остался вопрос.

В url.ini у меня есть

[home]
post = "{user}/{year}/{month}/{day}/{title}.html"
.......
.......
.......
news = "{year}/{month}/{day}/{categories}/{title}.html"

Я бы хотел, чтобы осуществлялся редирект не на post (как делает скрипт), а на news.
Это проблема?

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

Код поправил.
На счет вида ссылки, то тут надо делать так, как у тебя в шаблонах ссылки выводятся.

@header('Location: '.$rlink['rlink']['post']);

$rlink['rlink']['post'] - тут post надо поменять на то, что у тебя в шаблоне стоит... Это аналог $tpl[post][link][post]

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

Пф.... так сосредоточился на том, чего не понимаю, что не заметил очевидного!

Спасибо ещё раз!

Re: Redirect .htaccess на ЧПУ (регулярное выражение)

Ничего странного - я же заменил переменные, чтобы никаких пересеканий не было...

Здесь молодость бродит крылато, и старость не клонит голов...
Демо площадка Strawberry 1.2 - заходим и тестируем!