vBulletin и XML Sitemap
Честно говоря я ожидал большего от форума за 200 баксов, сам по себе он конечно хороший, и новую тему красивую сделали, Ajax фишки всякие, интеграция с Facebook и прочее, но в части - SEO косяков хватает. Например когда яндекс ходит по сайту, то за каким то хреном vBulletin добавляет к урлам идентификатор сессии типа такого http://forum/showthread.php?t=25&s=23fa3a53f618eef974590df0991c8df3&pagenumber= так же отметил жирным тут pagenumber который в данном случае вообще не нужен в топике в котором всего одна страница. Тут я описал как избавиться от session id в урлах для поисковиков на примере Яндекса. Дальше идут разнообразные сортировки по количеству постов, количеству просмотров, названию темы, автору темы, последнему ответившему, и это все в каждом из разделов форума. То есть на каждый раздел форума получается 5 дублирующих страниц, и это не считая постраничной навигации по каждой из подобных страниц. При этом какая из них вылетит в Supplemental Results в гугле остается только гадать. К счастью от кучи этого дерьма можно избавится с помощью robots.txt, который я обновил после того как только установил и настроил форум
Это мой обновленный robots.txt для vbulletin, в нем остались куски которые запрещают индексацию старых урлов оставшихся от SimpleMachines Forum (SMF).
User-agent: * Disallow: /search.php Disallow: /faq.php Disallow: /memberlist.php Disallow: /showgroups.php Disallow: /register.php Disallow: /calendar.php Disallow: /sendmessage.php Disallow: /online.php Disallow: /newthread.php Disallow: /attachment.php Disallow: /tags.php Disallow: /misc.php Disallow: /printthread.php Disallow: /member.php Disallow: /members/ Disallow: /archive/ Disallow: /subscription.php Disallow: /usercp.php Disallow: /clientscript/ Disallow: /forums/ Disallow: /threads/ Disallow: /xmlsitemap.php Disallow: /*&sort* Disallow: /*&sort=* Disallow: /*&mode* Disallow: /*&mode=* Disallow: /index.php?board=* Disallow: /index.php?action=* Disallow: /index.php?topic=* Sitemap: http://forum/sitemap.xml
В форум так же встроена функциональность по созданию файлов XML Sitemaps, которая написана достаточно убога и вот почему: урл к карте сайта выглядит так http://forum/xmlsitemap.php этот скрипт генерит Sitemap Index в котором ссылки на урл по которому выдается sitemap по темам и разделам форума. Вот что он генерит
<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap> <loc>http://forum/xmlsitemap.php?fn=vbulletin_sitemap_forum_0_32.xml.gz</loc> <lastmod>2010-06-13T07:17:54-05:00</lastmod> </sitemap> <sitemap> <loc>http://forum/xmlsitemap.php?fn=vbulletin_sitemap_thread_1_16.xml.gz</loc> <lastmod>2010-06-13T07:17:54-05:00</lastmod> </sitemap> </sitemapindex>
За каким то чертом скрипт этот постоянно меняет vbulletin_sitemap_forum_0_32.xml.gz цифры, отмеченные жирным. Уже несколько раз было так что приходит бот, а вместо файла получает пустоту. Так что скрипт этот я запретил в robots.txt и написал свой и добавил его в cron, ниже его содержимое, может кому пригодится. Пока что урлов на форуме у меня мало, так что скрипт не создает несколько XML Sitemap файлов и Sitemap Index так же как и не сжимает все это. В дальнейшем когда это понадобится добавлю
<?php
#!/usr/local/bin/php
<?php
$dbUser = 'your_username';
$dbName = 'your_db_name';
$dbPassword = 'TOP_SECRET';
$sitemapSavePath = '/path/to/forum';
$forumUrl = 'http://forum/';
$db = new mysqli('localhost', $dbUser, $dbPassword, $dbName);
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$urlset = $dom->createElement('urlset');
$dom->appendChild($urlset);
$urlsetAttr = $dom->createAttribute('xmlns');
$urlset->appendChild($urlsetAttr);
$urlsetAttrText = $dom->createTextNode('http://www.sitemaps.org/schemas/sitemap/0.9');
$urlsetAttr->appendChild($urlsetAttrText);
$result = $db->query('SELECT threadid,lastpost FROM thread');
while ($obj = $result->fetch_object())
{
$url = $dom->createElement('url');
$urlset->appendChild($url);
$loc = $dom->createElement('loc');
$url->appendChild($loc);
$urlTxt = $dom->createTextNode($forumUrl . 'showthread.php?t=' . $obj->threadid);
$loc->appendChild($urlTxt);
$lastmod = $dom->createElement('lastmod');
$url->appendChild($lastmod);
$lastmodTxt = $dom->createTextNode(date('Y-m-d', $obj->lastpost));
$lastmod->appendChild($lastmodTxt);
}
$result = $db->query('SELECT forumid,lastpost FROM forum');
while ($obj = $result->fetch_object())
{
$url = $dom->createElement('url');
$urlset->appendChild($url);
$loc = $dom->createElement('loc');
$url->appendChild($loc);
$urlTxt = $dom->createTextNode($forumUrl . 'forumdisplay.php?f=' . $obj->forumid);
$loc->appendChild($urlTxt);
if ($obj->lastpost)
{
$lastmod = $dom->createElement('lastmod');
$url->appendChild($lastmod);
$lastmodTxt = $dom->createTextNode(date('Y-m-d', $obj->lastpost));
$lastmod->appendChild($lastmodTxt);
}
}
$domHandle = fopen($sitemapSavePath . 'sitemap.xml', 'w');
fwrite($domHandle, $dom->saveXML());
fclose($domHandle);
?>
Комментарии