Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2006-11-18 23:46:31

maximum
Гость

Индексация ссылок на пост

А вы знаете, что на форуме существует очень серьёзная ошибка, в плане индексации поисковыми машинами. Так вот, смотрим сюда: http://www.yandex.ru/yandpage?&q=179529 … unbb.ru%26 И понимаем, что все метки вида /viewtopic.php?pid=1234#p1234 индексируются в виде /viewtopic.php?pid=1234, что в свою очередь создаёт дополнительную неразбериху для серфера, дополнительную нагрузку и дубли страниц топиков.

Пошёл копать и экспериментировать. И вы тоже можете, посмотрите как работают другие форумы...

Можно воспользоваться модом

##
##    MOD TITLE :
##    Stop duplication of URL of post in the search engines.
##    Mod version : 1.2
##    Works on PunBB : 1.2.* (and probably before)
##    Release date : 24-04-07
##    Author : Julien VAUBOURG (Ju) [CtrlAltSuppr.com]
##
##    DESCRIPTION
##
##    On a same topic :
##    http://FORUMS/viewtopic.php?pid=XXX#pXXX
##    http://FORUMS/viewtopic.php?pid=YYY#pYYY
##    The addresses of post are considered by search engine as two
##    different pages while they have the same contents.
##    This mod prevents the duplication of the contents in engine.
##
##    Affects DB : No
##    Affected file : footer.php
##
##    Note : Also work with URL Rewriting.
##    > Note : Fonctionne йgalement avec l'URL Rewriting.
##
##    DISCLAIMER :      Please note that 'mods' are not officially supported by
##            PunBB. Installation of this modification is done at your
##            own risk. Backup your forum database and any and all
##            applicable files before proceeding.
##



#
#---------[ 1. OPEN ]---------------------------------------------------
#

footer.php

#
#---------[ 2. FIND (line: 157) ]---------------------------------------------------
#

// Close the db connection (and free up any result data)
$db->close();

#
#---------[ 3. BEFORE, ADD ]---------------------------------------------------
#

/* Dйbut - Empкcher la duplication des adresses */

// URL Rewriting ?
$pattern_in = 'viewtopic.php?pid=<PID>';
$pattern_out = 'viewtopic.php?id=<ID>&p=<P>';

// On commence par rйcupйrer les pid de tous les liens qui appellent un message prйcis
preg_match_all('#'.str_replace('\<PID\>', '([0-9]+)', preg_quote($pattern_in, '#')).'#', $tpl_main, $pids);
$pids = array_unique($pids[1]);

if(!empty($pids)) {

    // On rйcupйre ensuite les id des topics qui correspondent aux diffйrents pid
    $result = $db->query('SELECT id, topic_id FROM '.$db->prefix.'posts WHERE id='.implode(' OR id=', $pids)) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
    if (!$db->num_rows($result))
        message($lang_common['Bad request']);

    while ($pid_id = $db->fetch_assoc($result))
    {
        $adresse[$pid_id['id']] = Array('topic_id' => $pid_id['topic_id']);

        if (isset($query))
            $query .= ' OR topic_id='.$pid_id['topic_id'];
        else
            $query = $pid_id['topic_id'];
    }

    // On rйcupйre et on classe ensuite les pid de tous les posts de tous les topics concernйs
    $result = $db->query('SELECT topic_id, id FROM '.$db->prefix.'posts WHERE topic_id='.$query.' ORDER BY posted') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
    while ($id_pid = $db->fetch_assoc($result))
        $posts[$id_pid['topic_id']][] = $id_pid['id'];

    // On recherche les pid des liens dans les pid des topics et on rйcupйre la place qu'ils occupent pour calculer leur page
    foreach ($posts AS $id => $pids)
    {
        foreach(array_keys($adresse) AS $pid) {
            if(($position = array_search($pid, $pids)) !== false)
                $adresse[$pid]['p'] = ceil(($position + 1) / $pun_user['disp_posts']);
        }
    }

    // On remplace enfin les adresses avec les pid par des adresses uniques et directes avec l'id du topic en prйcisant la page
    foreach($adresse AS $pid => $url)
        $tpl_main = str_replace(str_replace('<PID>', $pid, $pattern_in).'#', htmlentities(str_replace(Array('<ID>', '<P>'), Array($url['topic_id'], $url['p']), $pattern_out)).'#', $tpl_main);
}

// On en profite pour virer tous les ?p=1 ou &p=1 qui doublonnent aussi inutilement les pages
$tpl_main = preg_replace('#(\?|&amp;)p\=1([^0-9]{1})#', '$2', $tpl_main);

/* Fin dupplication */

#
#---------[ 4. SAVE/UPLOAD ]---------------------------------------------------
#

Редактировался maximum (2008-06-13 10:33:06)

#2 2006-11-19 10:35:26

SDTux
Гость

Re: Индексация ссылок на пост

Особой критичной проблемы, конечно, нет, однако, в принципе это, конечно, не правильно...
*ушел думать

#3 2006-11-19 11:56:39

Slavik
Гость

Re: Индексация ссылок на пост

А нельзя просто сделать p=pid? Только я так и не понял какая нагрузка и откуда дубли.

#4 2006-11-19 12:08:57

hcs
Гость

Re: Индексация ссылок на пост

Имхо это не столько ошибка форума, сколько ошибка поисковой системы. Причем на яндексе она не одна такая. Очевидно, что яндекс вырезает из запросов сспец-символы, в результате чего некоторые страницы при помощи яндекса найти вообще невозможно. Поэтому я им не пользуюсь.
Решение проблемы - ЧПУ, но это тоже нагрузка на сервер, да еще какая.

#5 2006-11-20 10:52:39

maximum
Гость

Re: Индексация ссылок на пост

Slavik пишет:

А нельзя просто сделать p=pid? Только я так и не понял какая нагрузка и откуда дубли.

Как это "просто"? Вот смотри сюда, кликай там, и поёмёшь про что я говорю. http://www.yandex.ru/yandsearch?serveru … c.php?pid=

hcs
Понимаю, что на большинстве форумов присутствует данная "дыра", но! возможности подкрутить что - либо в поисковых системах у нас нет, зато есть возможность изменить в движке форума.

Я вот досихпор не могу понять, хотя бы на примере яндекса (про гугл сейчас говорить не будем, потому, что на некоторые ссылки стоит rel=nofollow), почему ссылки на посты (делее по тексту как метки) индексируются выборочно? Тоесть, мы же не видим в индексе всех 5237 постов. Значит он вовсе не индексирует метки на viewtopic, а берёт их из внешних ссылок, и как я заметил на одном своём новом форуме, из меток с viewforum и index.

Решений проблемы несколько. Это закрыть через robots /viewtopic.php?pid= либо, вернуться к истокам, тоесть к наиболее правильному варианту
/viewtopic.php?tid=123#123456, где вторая переменная порядковый номер поста в топике (пример: http://forum.ixbt.com/ ).

#6 2006-11-20 11:03:37

hcs
Гость

Re: Индексация ссылок на пост

Ну яндекс-бот зашел на главную страницу, собрал там все ссылки, в них попали ссылки на темы которые последние в том или ином разделе (/viewtopic.php?pid), и все дела. В следующий раз он заходит, там другие ссылки, поэтому и получается что выборочно, а якоря яндекс тупо вырезает.

#7 2006-11-20 21:48:48

maximum
Гость

Re: Индексация ссылок на пост

Так это я и понял, что боты неким образом находясь во viewtopic не принимают метки, как ссылки на отдельные страницы, а считают это одной и той же страницей.

Кстати, у гуру сео тоже нет никаких меслей по данному поводу: http://forum.searchengines.ru/showthread.php?t=93974

Да, и ещё, сервисы поиска по блогам отлично хавают такие ссылки.

#8 2006-11-20 23:08:02

Slavik
Гость

Re: Индексация ссылок на пост

Чего-то я не видел в форуме ссылок типа ?pid=123#321, обычно ?pid=123#123, те вне зависимости от #??? открывается одна и та же тема, то есть ссылку ?pid=123 можно считать ссылкой именно на пост #123, соответственно p=pid smile

#9 2006-11-21 05:06:01

hcs
Гость

Re: Индексация ссылок на пост

Совершенно справедливо, и получается что, с яндекса сёрфер придет не к якорю а к началу страницы.

Добавлено Tue Nov 21 08:16:18 2006 :

maximum пишет:

боты неким образом находясь во viewtopic не принимают метки, как ссылки на отдельные страницы,

Это и не есть отдельные страницы, это абсолютно те же самые страницы, только с якорями для браузеров. Наверно так боты и думают. Кстати вполне логично с точки зрения разработчиков, поскольку если хранить в бд еще и индекс якорей, которые указывают на одну и ту же страницу, которых на странице может быть десяток, то это уже нагрузка на БД поисковика smile

#10 2006-11-21 17:23:42

Slavik
Гость

Re: Индексация ссылок на пост

А вот что # нельзя вытащить из php я не учел, хотя оно и к лучшему, можно сделать так:

if ($pid) echo "<script> . . . </script>"

А вот вместо "..." надо написать скрипт, редиректящий на #pid, если нету символа решетки, так даже страничка не должна перегружаться. Думаю гуру js это осилят smile

#11 2006-11-21 22:49:03

maximum
Гость

Re: Индексация ссылок на пост

Slavik пишет:

Чего-то я не видел в форуме ссылок типа ?pid=123#321, обычно ?pid=123#123, те вне зависимости от #??? открывается одна и та же тема, то есть ссылку ?pid=123 можно считать ссылкой именно на пост #123, соответственно p=pid smile

И не будет, я другой пример приводил, который пока и не получается реализовать правильно, это когда ссылка на конкретный пост принимает вид: tid=$1#$2 , где $1 - id_topic; $2 - post_count (тоесть порядковый номер сообщения в топике). Только такую структуру ссылки я вижу наиболее правильной со всех точек зрения! (и она присутствует на хоботе, который работает досихпор на движке ubb)

Нельзя считать, так как появляется идентичная страница, но не это главное, главное то, что без знака "#" перехода к метке в теле страницы и не будет.

А зачем ему хранить содержимое страницы, достаточно помнить о метках... Как я уже говорил, посмотрите на работу сервисов поиска по блогам, они ведь тоже форумы индексируют, причём более правильно. Может скоро под динамичные проекты типа блогов, форумов и гостевух будет полностью отдельный поиск? smile

Родилось тут... "Бот сука умный" (с) wink

#12 2007-01-06 19:03:25

maximum
Гость

Re: Индексация ссылок на пост

Вот, вспомнил, как над буджуями издевался, объясняя практически на пальцах чего от них я хочу. Подробнее: http://forums.punbb.org/viewtopic.php?id=13853 wink

Никто так и не ответил, но решение всё же появилось, из других источников.

Мод: http://www.punres.org/viewtopic.php?id=2611

##
##    MOD TITLE :
##    Stop duplication of URL of post in the search engines.
##    Arrкter la duplication des URL de messages dans les moteurs de recherche.
##
##    Mod version : 1
##    Works on PunBB : 1.2.* (and probably before)
##    Release date : 30-12-06
##    Author : Julien VAUBOURG (Ju) [CtrlAltSuppr.com]
##
##    DESCRIPTION
##
##    On a same topic :
##    http://FORUMS/viewtopic.php?pid=XXX#pXXX
##    http://FORUMS/viewtopic.php?pid=YYY#pYYY
##    The addresses of post are considered by search engine as two
##    different pages while they have the same contents.
##    This mod prevents the duplication of the contents in engine.
##
##    Dans un mкme topic :
##    http://FORUMS/viewtopic.php?pid=XXX#pXXX
##    http://FORUMS/viewtopic.php?pid=YYY#pYYY
##    Ces deux adresses de message sont considйrйes par les moteurs de recherche
##    comme deux pages diffйrentes, alors qu'elles ont un contenu identique.
##    Cette mod empкche la duplication de contenu dans les moteurs.
##
##    Affects DB : No
##    Affected file : footer.php
##
##    Note : Also work with URL Rewriting.
##    Note : Fonctionne йgalement avec l'URL Rewriting.
##
##    DISCLAIMER :      Please note that 'mods' are not officially supported by
##            PunBB. Installation of this modification is done at your
##            own risk. Backup your forum database and any and all
##            applicable files before proceeding.
##



#
#---------[ 1. OPEN ]---------------------------------------------------
#

footer.php

#
#---------[ 2. FIND (line: 157) ]---------------------------------------------------
#

// Close the db connection (and free up any result data)
$db->close();

#
#---------[ 3. BEFORE, ADD ]---------------------------------------------------
#

/* Dйbut - Empкcher la duplication des adresses */

// URL Rewriting ?
$pattern_in = 'viewtopic.php?pid=<PID>';
$pattern_out = 'viewtopic.php?id=<ID>&p=<P>';

// On commence par rйcupйrer les pid de tous les liens qui appellent un message prйcis
preg_match_all('#'.str_replace('\<PID\>', '([0-9]+)', preg_quote($pattern_in, '#')).'#', $tpl_main, $pids);
$pids = array_unique($pids[1]);

if(!empty($pids)) {

    // On rйcupйre ensuite les id des topics qui correspondent aux diffйrents pid
    $result = $db->query('SELECT id, topic_id FROM '.$db->prefix.'posts WHERE id='.implode(' OR id=', $pids)) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
    if (!$db->num_rows($result))
        message($lang_common['Bad request']);

    while ($pid_id = $db->fetch_assoc($result))
    {
        $adresse[$pid_id['id']] = Array('topic_id' => $pid_id['topic_id']);

        if (isset($query))
            $query .= ' OR topic_id='.$pid_id['topic_id'];
        else
            $query = $pid_id['topic_id'];
    }

    // On rйcupйre et on classe ensuite les pid de tous les posts de tous les topics concernйs
    $result = $db->query('SELECT topic_id, id FROM '.$db->prefix.'posts WHERE topic_id='.$query.' ORDER BY posted') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
    while ($id_pid = $db->fetch_assoc($result))
        $posts[$id_pid['topic_id']][] = $id_pid['id'];

    // On recherche les pid des liens dans les pid des topics et on rйcupйre la place qu'ils occupent pour calculer leur page
    foreach ($posts AS $id => $pids)
    {
        foreach(array_keys($adresse) AS $pid) {
            if(($position = array_search($pid, $pids)) !== false)
                $adresse[$pid]['p'] = ceil(($position + 1) / $pun_user['disp_posts']);
        }
    }

    // On remplace enfin les adresses avec les pid par des adresses uniques et directes avec l'id du topic en prйcisant la page
    foreach($adresse AS $pid => $url)
        $tpl_main = str_replace(str_replace('<PID>', $pid, $pattern_in), htmlentities(str_replace(Array('<ID>', '<P>'), Array($url['topic_id'], $url['p']), $pattern_out)), $tpl_main);
}

// On en profite pour virer tous les ?p=1 ou &p=1 qui doublonnent aussi inutilement les pages
$tpl_main = preg_replace('#(\?|&amp;)p\=1#', NULL, $tpl_main);

/* Fin dupplication */

#
#---------[ 4. SAVE/UPLOAD ]---------------------------------------------------
#

Хотя и не рабочий мод, но направление однозначно верное.

#13 2007-01-06 19:19:11

Dexus
Гость

Re: Индексация ссылок на пост

Вы не забывайте, что в punbb количество сообщений на странице гибко настраивается.
И если для одного человека ссылка на №страницы№сообщения_на_странице будет одна, то у другого она может быть совсем иной.
Тогда форум должен для всех ссылок, открытых с поисковиков - автоматом отключать куки залогиненного человека, чтобы из-за действия его профиля оказаться не там.

Редактировался Dexus (2007-01-06 19:20:15)

#14 2007-01-08 01:16:06

maximum
Гость

Re: Индексация ссылок на пост

Ну так это и в дефолтной версии движка есть. wink У кого - то может быть 5 сообщений на страницу, а у кого - то 500.

#15 2007-01-08 14:11:02

Dexus
Гость

Re: Индексация ссылок на пост

maximum пишет:

когда ссылка на конкретный пост принимает вид: tid=$1#$2 , где $1 - id_topic; $2 - post_count (тоесть порядковый номер сообщения в топике). Только такую структуру ссылки я вижу наиболее правильной со всех точек зрения! (и она присутствует на хоботе, который работает досихпор на движке ubb)

Я про это.
Ты упомянул хобот. В хоботе количество сообщений на страницу фиксировано, нет?
Не может ссылка на сообщение иметь вид tid=$1#$2 если у тебя тема занимает более 1й страницы.
Если у тебя всегда одна страница и все 500 сообщений на ней одной вмещаются - тогда без базара.

#16 2007-01-08 18:45:48

Slavik
Гость

Re: Индексация ссылок на пост

Люди, подскажите, можно из php вытащить полную ссылку, включая якорь? (не через js)

#17 2007-01-08 19:10:31

hcs
Гость

Re: Индексация ссылок на пост

Прям из пхп вытащить??

#18 2007-01-08 20:29:53

Dexus
Гость

Re: Индексация ссылок на пост

Якори не передаются серверу. Это чисто браузерская феня. Джаваскриптом якорь взять можно. И передавать его через XMLHTTPrequest вручную.

Редактировался Dexus (2007-01-08 20:30:52)

#19 2007-01-09 02:08:33

maximum
Гость

Re: Индексация ссылок на пост

Dexus пишет:

Я про это.
Ты упомянул хобот. В хоботе количество сообщений на страницу фиксировано, нет?
Не может ссылка на сообщение иметь вид tid=$1#$2 если у тебя тема занимает более 1й страницы.

Почему это не может? А сейчас тогда как реализовано? wink

#20 2007-01-09 11:11:19

Slavik
Гость

Re: Индексация ссылок на пост

hcs пишет:

Прям из пхп вытащить??

ну да, хотел без js, да видать действительно никак

Dexus пишет:

Джаваскриптом якорь взять можно. И передавать его через XMLHTTPrequest вручную.

Да нет, мне так круто не надо, хочу как уже объяснял сделать: если урл вида viewtopic.php?pid=123, то редиректить юзера на viewtopic.php?pid123#p123, если сразу такая ссылка то ничего не делать

maximum пишет:

Почему это не может? А сейчас тогда как реализовано?

сейчас это реализовано не tid'ом, а pid'ом. Так как якорь вытащить из php невозможно, то тогда номер порядковый сообщения узнать модно только кривым способом (как сказал Dexus), что абсолютно нерационально и убьет прелесть punbb еще больше чем attachment mod. Во как.

#21 2007-01-10 07:41:01

maximum
Гость

Re: Индексация ссылок на пост

Какая разница как реализовано, да и возможно, порядковые номера сообщений в теме есть? - есть... wink

Кстати, я глобально задумался о следующем:

Dexus пишет:

Вы не забывайте, что в punbb количество сообщений на странице гибко настраивается.
И если для одного человека ссылка на №страницы№сообщения_на_странице будет одна, то у другого она может быть совсем иной.
Тогда форум должен для всех ссылок, открытых с поисковиков - автоматом отключать куки залогиненного человека, чтобы из-за действия его профиля оказаться не там.

Даже пересмотрел большое количество форумов с ЧПУ. И понял, что проблема есть, пока жёстко не фиксируется количество постов в топике. Выход есть, и я его уже озвучивал.

maximum пишет:

когда ссылка на конкретный пост принимает вид: tid=$1#$2 , где $1 - id_topic; $2 - post_count (тоесть порядковый номер сообщения в топике).

Кстати, на официальном форуме об этом хотя бы задумались: http://forums.punbb.org/viewtopic.php?id=14271

#22 2007-01-27 16:13:35

Slavik
Гость

Re: Индексация ссылок на пост

У меня появилась бредовая идея, но все же: отдавать поисковикам при запросе вида viewtopic.ph?pid=***, только содержимое этого поста, а не всю страницу...

#23 2007-01-27 16:54:21

FedKoFF
Гость

Re: Индексация ссылок на пост

Сколько же тогда будет страниц на форуме по мнению поисковика hmm И как долго он их будет индексировать.

Редактировался FedKoFF (2007-01-27 16:54:41)

#24 2007-01-27 16:58:44

Slavik
Гость

Re: Индексация ссылок на пост

Он и так индексирует одну и ту же страницу, но с разными запросами, зато теперь на один пост не должно быть более двух ссылок и при переходе на форум будет открываться сразу на нужном посте

Добавлено  01.27.2007 20:01:47:

maximum пишет:

Хотя и не рабочий мод, но направление однозначно верное.

А что он делает? А то комментарии на французском меня сильно не просветили

#25 2007-01-30 18:43:48

maximum
Гость

Re: Индексация ссылок на пост

Slavik пишет:

У меня появилась бредовая идея, но все же: отдавать поисковикам при запросе вида viewtopic.ph?pid=***, только содержимое этого поста, а не всю страницу...

А пользователю что? Можно, только как вобла - один пост серферу и поисковику, в противном случае это будет называться клоакинг.

Slavik пишет:

А что он делает? А то комментарии на французском меня сильно не просветили

Точнее работает, он модифицирует путь вида viewtopic.php?pid=<PID> в viewtopic.php?id=<ID>&p=<P>. Ставьте себе, всё отлично работает.

Да, а мне вот ещё и общаться прихотися с автором мода, правда на ломанном английском.

Подвал доски

Под управлением FluxBB. Хостинг Hostens