Борьба с одинаковыми урлами:
1) если сами пишем ЧПУ в форме добавления поста
AJAX-запросом проверяем, есть ли в базе такой ЧПУ и если нет - все ОК, если есть - говорим добавлятелю(админ, редактор, ваш вариант) что измените УРЛ.
2) Если есть механизм, который транслитирует название поста в ЧПУ:
При добавлении в БД также смотрим, есть ли такой ЧПУ уже в базе. Если нет - все ОК, если есть, конкатенируем к названию time() - самый бредовый вариант, который пришел в голову. Так что одинаковость ЧПУ разных записей не проблема, над которой стоит заморачиваться.
Чтобы не делали дубли подставлением GET данных в урл делаем следующее:
if (count($_GET) > Х){ header('http/1.0 404 not found');}
Х мы берем в зависимости от нашего ЧПУ. В моем варианте 2 параметра - url=$1&rewrite=1, то есть Х будет равен 2
Разница между Вашим подходом и нашим в масштабируемости, количестве директорий и файлов.
Захотели что-то изменить в структуре вообщем:
у Вас - правим все индексные файлы в папках new, articles, category, ...
у Нас - правиться 1 файл.
Посмотрите ради интереса опенКарт, там как раз все реализовано через 1 индекс.пхп в корне, да и ВП помоему точно также реализован.
Коллектив серча VS Попов
Потом будет кричать что количеством взяли:)
Идея давно есть в голове, но проблема в том, что у многих людей здесь не найдется на это время. А самому делать это нет особого желания, потому что вдруг что-то упущу:)
ЗЫ. да и начинать это делать с мыслью о перспективе курса оказаться на торент-трэкерах... как-то не стоит.
Ladycharm, чтобы не было злых дублей от конкурентов делаем следующее:
1) В таблицу с постами добавляем регистроЗависимое(ставим правильный коллэйшн) поле `perm_url`
2) В интерфейсе добавления поста добавляем еще 1 инпут и там пишем ЧПУ адрес. Либо же делаем какой-нить механизм(например транслитерация урлов из названия записи).
3) Делаем как писал в предыдущем посте
RewriteEngine OnRewriteRule ^articles/([\d\w-]+)\.html articles.php?url=$1?rewrite=1 [L]
4)файл articles.php
if ( !isset($_GET['rewrite']) ){ die('Давай досвидания .!.');}$sql = "SELECT * FROM `gcms_posts` WHERE `perm_url`='{$_GET['url']}'";$result = mysql_query($sql);if (mysql_num_rows($result) != 0){ //отдаем контент}else{ header('http/1.0 404 not found');}
В итоге, к странице www.gs.ru/articles/kak-sdelat-true-site.html мы можем достучаться тока по этому адресу.
Если сделаете www.gs.ru/articles/Кak-sdelat-truE-site.html то получите 404 ошибку, так как поле регистрозависимое.
Сможете в данной ситуации сделать дубли?
На счет:
Вариант не самый тру. ИМХО
Чем Вам модреврайт не угодил? В вашем случае, если у меня есть статьи, категории, новости придется создавать 3 папки.
А можно через index.php в корне(классика жанра) все это дело разруливать.
ЗЫ. такой вариант очень редко прокатывает(разница 115 лет), потому что за эти 115 лет уже за нас всё 100500 раз придумано, продумано, протестировано, отлажено и нам остается тока взять и заюзать!
1) * - применяется в 2-ух случаях: отладка/тест/разработка, процесс обучения.
2) Данные должны фильтроваться.
Я то дурья голова, решил что Попов об этом рассказывает и ТС зашарит:)
ЗЫ. На счет фильтрации. Она как бэ уже есть в РеврайтРуле, и если это будут не буквы, цифры, тире, то реврайта не будет.
Если есть вариант SQL-injection - просветите.
Есть вариант %39(преобразование в шеснадцатиричное значение), но:
1) Если преобразование будет до моДреврайта, то оно преобразуется в одинарную ковычку и это не попадет под правило, соответственно реврайт не сработает
2) Если преобразование происходит после модРеврайта, то он не пропустит знак %
Я думаю, что преобразование типа urldecode веб-сервер делает до модРеврайта.
Без использования одинарной ковычки Скуля невозможна. Во всяком случае я так считаю. Не прав - просветите:)
Смотрел пару видосов Попова(судьба меня пощадила, и я не платил за них деньги), так вот, основная проблема: он показывает что делать, но не объясняет почему делается так, а не по другому. То есть он показывает частные случаи, и редко когда объясняет сам принцип. ИМХО!
Боюсь, что из-за условия в инструкции номер 2 - получиться бесконечный цикл:)
ЗЫ. если Вам не нравиться что здесь все такие умные - задайте свой вопрос здесь. Будет круто!
if (mysql_nuw_rows($result) == 0)
//Отдаем 404 или еще че
else
{
//ПОказываем контент
}
Единственное, два дифиса отрезают кусок идующий за ними(комментарий в мускуле.) Поэтому их надо фильтровать или еще что-то.
Хотите понять логику - напишите отзыв на сайте Попова с просьбой создать еще 1 платный курс по HTACCESS в целом и модРЕврайту в частности:)
RewriteEngine On
RewriteRule ^articles/([\d\w-]+)\.html articles.php?url=$1 [L]
1) создаем дополнительное поле в таблице с постами. Называется пусть оно, примитивно perm_url
2) В файле(articles.php) получаем $_GET['url'].
Выбираем из БД все что связано с этой записью
$sql = "SELECT * FROM `gcms_posts` WHERE `perm_url`='{$_GET['url']}'";
Ну и дальше тоже самое, что и сейчас делается.
Само собой, что при создании поста надо в таблицу писать значение для поля perm_url(руками или транслит-скриптом дело вкуса).
Теперь Мы имеем урлы типа
www.gs.ru/articles/mo9-nova9-mawina-slomalas
В названии статьи можно использовать буквы, цифры, минус/тире
Я думал, ТС догадается, что речь идет о ЗЫСе:) Имя-то по ссылке передавать это ЛОЛ:)
Телепатов не ма, так что извольте поделиться Вашим пониманием слова "привести".
Если хотите получить нормальный ответ - научитесь задавать вопросы ПРАВИЛЬНО!