[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ЧПУ в сотый раз
asdf27
Ребятки, уже голову сломал. Не могу разложить по полочкам.

Структура сайта http://joysea.ru:

1. Файл place.php, имеет переменные вида ?place_id=(1,2,3...101) - это категории (курорты).
2. Идет ссылка на подкатегорию place.php?place_id=3&articles - перечень материалов
3. Идут ссылки на материалы - place.php?place_id=3&articles&art=4 - одиночная статья.

Есть еще другие разделы вида place.php?place_id=3&distance - перечень городов
и ссылки вида place.php?place_id=3&distance&from=4&to=3 - from это начальный город, to - конечный.

Отсюда http://www.youtube.com/watch?v=5Uhm7Xv5Nqc мне стал понятен принцип роутера, но как конкретно применимо к моему сайту реализовать?

(?) Мне нужно REQUEST_URI сравнивать и со старыми, и с новыми url'ами? Если старый, то 301 редирект на новый? А как с запросами к базе? Разбирать чпу урл на массив, находить название статьи и уже брать ID?
johniek_comp
давай по порядку
для первого варианта правило
RewriteRule ^place/([0-9]+)$ place.php?place_id=$1 [L]

2-й
RewriteRule ^place/([0-9]+)/(.*)$ place.php?place_id=$1&$2 [L]


сможешь по аналогии сделать сам для 3-ого, будешь молодцом

_____________
user posted image
asdf27
Нет, не так.
Названия перегоню в транслит, дальше мне нужно _из_ place.php?place_id=3 _получить_ lazarevskoe/

johniek_comp
напиши нормально какой url ты хочешь

_____________
user posted image
asdf27
Например, http://joysea.ru/place.php?place_id=3&art=25 на выходе http://joysea.ru/lazarevskoe/krabovoe-ushelie.html


В сумме, верный ли алгоритм:

1. Делаю таблицу вида sef | old , где перечисляю урлы для редиректа со старых на новые.
2. Определяю, sef-урл, или обычный. Если обычный, то делаю 301 редирект на новый. Если новый, то разбираю на массив explode('/') и определяю что есть что в урле.
3. Далее делаю запрос вида
SELECT * FROM category WHERE sef='lazarevskoe';
$place_id=$row[id];
и дальше скрипт работает как работал.

Верно?
asdf27
Очень сложно пока дается план перехода, т.к. надо сразу все разделы прописать в таблице сравнения старый-новый урл. Можно ли сделать в урле часть ЧПУ, а часть оставить в виде GET-переменных?

Это для того, чтобы постепенно переезжать. Например, http://joysea.ru/place.php?place_id=3&art=25 преобразовать в http://joysea.ru/lazarevskoe/&art=25 . Но так ошибка. Понимаете что я имею ввиду?
asdf27
Немного стало проясняться. В таблице добавил поле sef, в урле добавил переменную &palcesef=sochi

Теперь запара:

RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?place_id=2&placesef=$1 [QSA,L]


Т.е. вида http://joysea.ru/sochi/ добился, но как вот этот кусок ?place_id=2 прописать чтобы любое число?

В смысле что проигнорировать переменную place_id, чтобы урл на основании переменной placesef формировался.
asdf27
Сделал так
RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?place_id=(.)&placesef=$2 [QSA,L]


Теперь как сделать 301 редирект со старых на новые? Пока нужно точное вхождение, без дополнительных переменных, т.е. placesef=$2 это конец строки.
asdf27
Процесс пошел, но не ясно с предыдущим вопросом, редирект с htaccess.

Вот текущий алгоритм:

1. Названиям курортов (аналогично и статьи, видео, отели и прочее) добавлено поле sef с последующей транслитерацией названий.
2. Добавлена GET-переменная в адрес для названий. Было place.php?place_id=3, стало place.php?placesef=lazarevskoe&place_id=3
3. Так как кода в сайте не мало и все данные дёргаются по ID, переменная place_id оставлена, но в .htaccess игнорируется при обозначении нового адреса.
Цитата
RewriteRule ^([-a-zA-Z0-9_]+)/$ place.php?placesef=$1&place_id=(.) [QSA,L]
RewriteRule ^([-a-zA-Z0-9_]+)/photos.html$ place.php?placesef=$1&place_id=(.)&photo [QSA,L]
RewriteRule ^([-a-zA-Z0-9_]+)/karta.html$ place.php?placesef=$1&place_id=(.)&map [QSA,L]
RewriteRule ^([-a-zA-Z0-9_]+)/pogoda.html$ place.php?placesef=$1&place_id=(.)&pogoda [QSA,L]
RewriteRule ^([-a-zA-Z0-9_]+)/svodka.html$ place.php?placesef=$1&place_id=(.)&svodka [QSA,L]
RewriteRule ^([-a-zA-Z0-9_]+)/video.html$ place.php?placesef=$1&place_id=(.)&video [QSA,L]

4. Если адрес не содержит переменную placesef, происходит 301 редирект на содержащий эту переменную урл.
5. Определяю, адрес новый или старый:
if (isset($_GET[place_id])) {
$place_id=(int)$_GET[place_id]; // беру ID курорта из урла
if ($place_id>0) { // если адрес старый, т.е. содержит GET-переменные, достаю нужные значения
if (!isset($_GET[placesef])) { // если нет переменной placesef, то добавляю её к адресу и делаю 301 редирект
$res=mysql_query("SELECT * FROM category WHERE id='$place_id' LIMIT 1"); $row=mysql_fetch_assoc($res);
$urlser=explode('?place_id',$_SERVER[REQUEST_URI]);
$newurl=$urlser[0].'?placesef='.$row[sef].'&place_id'.$urlser[1];
header("HTTP/1.1 301 Moved Permanently");
header("Location: $newurl");
exit();
}
// если переменная есть, предыдущее условие пропускаем и достаем sef-адрес курорта
$res=mysql_query("SELECT * FROM category WHERE id='$place_id'"); $row=mysql_fetch_assoc($res);
$place_sef=$row[sef];
}

else if ($place_id<1) { // а если адрес новый, то GET-переменных в урле нет. Ищем курорт по значению sef-названия
$sef1=explode('/',$_SERVER[REQUEST_URI]);
$sef=$sef1[1];
$res=mysql_query("SELECT * FROM category WHERE sef='$sef'"); $row=mysql_fetch_assoc($res);
$place_id=$row[id];
$res=mysql_query("SELECT * FROM category WHERE id='$place_id'"); $row=mysql_fetch_assoc($res);
$place_sef=$row[sef];
}
}

6. Теперь мне нужно добавить GET-переменных для категорий отелей, названий отелей, категорий статей, названий статей и что-то еще, что забыл.
7. В финале мне нужно сделать 301 редирект посредством старых адресов на новые. Как?)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.