Объявление

Хотите приглашение на сайт? Пишите: niikto@samovarchik.info


 

Re: Ссылка на отдельный пост (PID)

Здесь я хотел бы обсудить проблему множественной адресации на одну и ту же тему.

Небольшое отступление:
Тема - это набор сообщений объединенных общим идентификатором темы (TID, Topic IDentifier). Каждое такое сообщение имеет собственный идентификатор - PID (Post IDentifier).


Исторически так сложилось, что на одну и ту же тему можно ссылаться 2 разными способами - с указанием ID темы (http://samovarchik.info/viewtopic.php?id=3313) и с указанием ID сообщения (http://samovarchik.info/viewtopic.php?pid=6943#p6943). Каждое служит своей цели: ID темы позволяет просто открыть нужную тему (и нужную страницу, если указана в URL), ID сообщения позволяет более точно сослаться на конкретное сообщение (вместо фраз "3 сообщение сверху на 2 странице такой-то темы").

Побочным эффектом является то, что при стандартных настройках отображения (25 сообщений на страницу) для одной и той же темы существует 26 разных URL-адресов:

http://samovarchik.info/viewtopic.php?id=3313
http://samovarchik.info/viewtopic.php?pid=6943#p6943
http://samovarchik.info/viewtopic.php?pid=6944#p6944
.....
http://samovarchik.info/viewtopic.php?pid=7638#p7638

А для первой страницы темы еще и 27-ой адрес:

http://samovarchik.info/viewtopic.php?id=3313&p=1

В результате поисковые машины считают, что у нас на сайте лежит 26-27 одинаковых страниц, каждая из которых ссылается на все другие, и как мне сообщили (сам я этим вопросом не интересовался), это плохо для выдачи этих самых страниц на запросы пользователей в поисковиках.

Совсем отказаться от использования PID невозможно, и ниже я объясню почему. Но сперва некоторые варианты решения.

В идеале бы хотелось все свести к URL вида http://samovarchik.info/viewtopic.php?id=3313#p7638 и по якорю определять нужное сообщение, но:

  • Так сложилось, что браузеры считают, что якорь нужен только им, чтобы показать пользователю нужное место на странице после ее загрузки, и серверу они его не передают, т.е. серверу будет сообщено, что от него требуют страницу http://samovarchik.info/viewtopic.php?id=3313 и никакого #p7638 там нету. Есть способы при помощи JavaScript узнать якорь и сообщить его серверу (например, поместив в специально отведенные для этого cookies и обновив страницу), но это все лишние "костыли" и не везде будет работать.

  • Учитывая вышесказанное, для сообщений, не поместившихся на первой странице, придется также указать номер страницы &p=N, что явно не добавляет универсальности. Если в самом начале темы удалить/переместить из нее достаточное количество сообщений, чтобы наше целевое сместилось на другую страницу, то старые ссылки на это сообщение станут недействительными. Кроме того, администратор в какой-то момент может решить что 25 сообщений на странице - это слишком мало, и увеличит это число до 50 (число выбрано не "с потолка"), то абсолютно все ссылки, содержащие &p=N станут недействительными.

  • В какой-то момент админ или модератор решат, что один из комментариев к статье настолько хорош, что претендует быть отдельной статьей, и выделят его в отдельную тему. Но т.к. он был хорош, то на него уже успели сослаться несколько десятков человек, чьи ссылки в этот момент станут недействительными.

Сейчас в движке используется именно такой подход, ID темы + номер страницы + якорь на сообщение. Адресация по PID при этом сохранена (зачем - ниже), но в такие страницы дополнительно помещается META-тэг:

<meta name="ROBOTS" content="NOINDEX, FOLLOW" />

который (теоретически) должен препятствовать индексированию поисковыми роботами.

Вернемся к вопросу, почему же нельзя совсем отказаться от PID. Есть как минимум три случая, когда использование PID избавляет от довольно большого количества запросов к БД:

  • Ссылка на последнее сообщение в index.php и viewforum.php

  • Ссылка на новые сообщения в viewforum.php

  • Ссылка на сообщение в результатах поиска сообщений (search.php).

Во всех трех случаях для получения ссылки вида http://samovarchik.info/viewtopic.php?id=X&p=Y#pZ потребовалось бы выполнить по запросу к БД для каждой такой ссылки.


Зачем я все это написал?
Я предлагаю пойти другим путем:
Вернуть обратно ссылки с PID. При переходе по такой ссылке, движок вычисляет адрес вида http://samovarchik.info/viewtopic.php?id=X&p=Y#pZ (что неявно он и сейчас вынужден делать, чтобы отобразить нужные данные), но вместо отображения страницы делает безусловную переадресацию на вычисленный адрес. Т.е. в адресной строке браузера вместо http://samovarchik.info/viewtopic.php?pid=Z#pZ, будет http://samovarchik.info/viewtopic.php?id=X&p=Y#pZ.
Плюс мы избавляемся от описанных выше проблем.

Кстати

Только что обнаружил, что на fluxbb.org.ru, где тоже используется принцип "ID темы + номер страницы + якорь на сообщение", такие редиректы существуют и используются как раз для тех случаев. Однако кода, реализующего эти редиректы, в репозитории я не вижу, наверное там не самая последняя версия лежит.

Но для этого нужно знать, а не относятся ли поисковики к таким переадресациям еще хуже, чем к множественным адресам на одну и ту же страницу? С моей точки зрения - нет. Они переходят по адресу, где нет ничего, кроме указания двигаться к другому адресу, а другой адрес им уже известен и его индексировать не надо.
Жду комментариев от разбирающихся в SEO.

Редактировался yoorick (05.12.2011, 19:46:34)

Re: Ссылка на отдельный пост (PID)

Добавил редирект от PID к Topic ID. Ссылки на посты в viewtopic.php пока не трогал.

Re: Ссылка на отдельный пост (PID)

Немного справочной информации.

Согласно документации, при переадресации через заголовки - header('Location: ...'); - браузеру передается код перенаправления 302.

Это-же подтверждается экспериментально:

Эксперимент

URL:

http://flux.localhost/pe/viewtopic.php?pid=128#p128

Запрос:

GET /pe/viewtopic.php?pid=128#p128 HTTP/1.1
Host: flux.localhost
User-Agent: Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.9.168 Version/11.52
Accept: text/html, application/xml;q=0.9, application/xhtml xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers

Ответ:

HTTP/1.1 302 Found
Date: Mon, 05 Dec 2011 21:04:33 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.10
Location: viewtopic.php?id=7&p=4#p128
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

Кстати, похоже, что это не браузер не передает якорь серверу, а сервер игнорирует якорь в запросе. >>>

При желании, его можно переопределить:

header('Location: ...', true, 301);

Yandex по разному реагирует на редиректы в зависимости от возвращаемого сервером кода.

Редактировался yoorick (13.01.2012, 00:42:54)

Re: Ссылка на отдельный пост (PID)

Повторяющийся контент у Google.
Переадресация 301 у Google.

В общем, прихожу к выводу, что жесткая переадресация с кодом 301 у обоих поисковиков обработается нормально, и адресом страницы будет воспринят именно тот, на который ведет редирект, и он будет единичным, т.к. совпадает у всех 26 ссылок.

Ну и еще до кучи: метатеги и то, как их воспринимает google, nofollow и noindex

 

Дизайн сайта отсутствует
оформление: Группа «САМОВАРчик»

[ Сгенерировано за 0.020 сек, 8 запросов выполнено - Использовано памяти: 1.9 MiB (Пик: 1.97 MiB) ]