хак - доработка "скрытия линков от поисковиков"

26
На досуге обнаружил, что чуток неправильно работает режим скрытия линков от поисковиков(BLOG_URL_NO_INDEX=true). А именно если в посте идет ссылка на твой же ресурс, то его также LS обрамляет noindex + добавляет rel=nofollow. В общем текущее положение вещей меня не устраивало, так как это для СЕО неправильно. Тут же было мной сделано решение.

1. файл /classes/modules/sys_text/Text.class.php
Находим ф-цию:
public function MakeUrlNoIndex($sText)

Комментим содержимое ф-ции и заменяем на:

##### [hack] no_self_relnofollow #####
$all=array(); preg_match_all("/(<a .*>.*<\/a>)/Ui",$sText,$all);
foreach($all[1] as $atag){
    if(strpos($atag,$_SERVER['HTTP_HOST'])===false) $_atag="<noindex>".$atag."</noindex>";
    else $_atag=str_replace(array(" rel=\"nofollow\""," rel='nofollow'"),"",$atag);
    $sText=str_replace($atag,$_atag,$sText);
}
return $sText;
##### [hack] no_self_relnofollow #####

Этого уже достаточно чтобы новые топики правильно обрабатывались. Но уже созданные топики пока что опубликованы через старый обработчик, поэтому надо все мессаги переобработать заново — для этого я написал небольшой скриптик.
2. создаем файлик, например, /republish_topics.php — содержимое в архиве
3. Не забываем удалить файл после его запуска.

забираем хак здесь, чтобы получить нормальный файл /republish_topics.php: livestreet.ru/addons/95/
(пришлось залить как хак, потому что LS обрезает переводы строк и получается херня)
примеры:
внутренние линки в посте, без rel=nofollow и без noindex: ecovoice.ru/blog/eco/611.html
внешние линки в посте, с rel=nofollow и обрамлением в noindex: ecovoice.ru/blog/eco/370.html

п.с. представляется как «as is», если будут серъезные предложение или замечания — рассмотрю
  • +8
  • 11 октября 2009, 01:38
  • sys

Комментарии (65)

RSS свернуть / развернуть
и не забыть в файле republish_topics.php в самом верху добавить строчку
$_SERVER['HTTP_REFERER'] = 'http://' . $_SERVER['HTTP_HOST'] .'/';
0
угу, сейчас обновлю, хотя — непонятно у кого такие глюки возникают !?
HTTP_REFERER — всегда к хосту относится, даже если на шаренге висит…
0
если на прямую, то могут возникнуть
0
в смысле напрямую? ну я итак вроде напрямую обращаюсь, не через ajax и не через терминал :)
0
по прямой ссылке бывает, что вылетает атемп.
0
а млин… ну все верно REFERER ведь только при переходах заполняется, так… а почему у меня тогда все работает, сейчас гляну — что в серверных переменных висит…
0
хм… странно REFERER пустой как и должен быть…
ладно, потом покопаюсь — пока обновил архив с этой строчкой
0
пора уже и комментарии парсить на предмет ссылок ;)
0
Кстати да, в комментах ведь тоже могут линк оставить ,))
0
обработчик один и тотже, так что в комментах работает таже схема
линки на себя без nofollow и без noindex
линки на других с nofollow и с noindex
0
А что значит «кильнуть»? Как вообще воспользоваться скриптом?
Спасибо.
0
кильнуть — это означает удалить, запускается скрипт при прямом заходе yoursite.com/livestreet/republish_topics.php
он отработает и ничего не выведет, в случае если будут какие-то ошибки как правило ПХП скажет об этом
0
спасибо. проделал. действительно ничего не выдалось — чистый лист. Но проверил: в постах по-прежнему nofollow собственные ссылки…
0
а переменная $_SERVER['HTTP_HOST'] — ведет на ваш же сайт?
0
Эээ… Боюсь, не могу сего знать.)
Я пробовал и с
$_SERVER['HTTP_REFERER'] = 'http://'. $_SERVER['HTTP_HOST'] .'/';
(тогда пишет, что заголовки уже посылались) и без. Вот если без, то чистый лист тогда. А как посмотреть, куда ведет переменная? :-)
0
сделайте простой файл:
<?php echo $_SERVER['HTTP_HOST']; ?>

запустите его и скажите — что он возвращает?
0
Да, вернул имя домена без www. Т.е. всё как бы правильно должно быть?
0
угу, а на новых постах — все правильно? т.е. урл домена без nofollow?
0
ДА, на новых всё ок!
0
слейте опять архив с хаком, я обновил файл /republish_topics.php
1) добавил вывод того какие топики сейчас скрипт обновляет и нашел ли он топики вообще
2) увеличил время исполнения скрипта при помощи max_execution_time — может скрипт таймаутит
в общем — теперь скрипт должен выводить что-нибудь :) и можно уже отталкиваться, из-за чего именно не работает
0
Спасибо за старания. Вот что выдалось:

Founded 255 topics with URLS
Begin to process:

Finished
0
хм… не находит ид_топиков… странно !?!?
надо дебагать и смотреть — может какой-то хак вам перекрывает все…
сделайте после строчки:
foreach($rows as $r){

добавьте:
echo "<pre>"; print_r($r); echo "</pre>"; exit;


нам важно найти `topic_id` и дальше уже от него отталкиваться
0
Вообще оч. интересный рез-т!!!

Founded 255 topics with URLS
Begin to process:

Array
(
    [topic_id] => 2
    [topic_text] => 

Просмотреть увеличенную карту
    [topic_text_short] => 

Просмотреть увеличенную карту
    [topic_text_source] => 
Просмотреть Путешествие в Скандинавию 2008 на карте большего размера
    [topic_extra] => s:0:"";
)


Там между текстовыми строками вставился фрэйм с гугл-картой из одного моего топика, который в самом топике не отображается, а только код дам стоит этого фрэйма (парсер же его не пускает)…
0
ага, теперь примерно понятно — где искать,
срабатывает вот эта строчка:
if(!is_object($oTopic)) break;

т.е. объект не создается почему-то, не отрабатывает:
$oTopic=$oEngine->Topic_GetTopicById($r['topic_id']);


нужно смотреть конкретно в чем дело… модули может какие-то стоят… или версия старая ЛС и соответственно там по-другому как-то, короче надо прогера брать и смотреть

а по поводу iframe'a ничего странного — в базу ЛС складывает все правильно, а вот обработчик уже вырезает его — все правильно(с точки зрения ЛС) :)
0
Да, модулей у меня куча и хаков разных, но а версия — 0.3!

Ну пускай тогда хоть новые посты будут с не ноиндекными тэгами… И на том спасибо! :-)
0
По внутренним ссылкам:
где домен прописан с www — все путем, где без www — обрамляет по полной.
Как быть?
0
del.
0
Спасибо! Как раз этого не хватало.
0
  • avatar
  • pengo
  • 14 октября 2009, 13:11
Спс, радует. Только на слабых серваках и дешевых тарифах (как у меня) не хаватет тайма на большие статьи, что бы переписать линки. Надо время таймаута приподнять :) Но это я так, как дополнение
0
  • avatar
  • g3n0m
  • 24 октября 2009, 00:43
там добавлен таймаут, стоит строчка: set_time_limit
0
насколько я понял, такой линк он тоже откроет: google.com#livestreet.ru
+1
угу, спасибо — согласен баг, как исправлю обновлю
0
обновил, теперь можно юзать без опасений
0
офтоп: жду по 30 секунд пока на странице загрузится блок яндекс директ, а в след за ним и комментарии
0
а моя доработка тут причем?
она один раз отрабатывает при добавлении топика, дальше уже все из кэша или БД берется
0
Что-то у меня не выходит, даже при создании новых топиков с сылками, всё равно закрывает и свои и чужие, посмотрите пожалуйста, правильно ли код у меня получился:
public function MakeUrlNoIndex($sText) {
		##### [hack] no_self_relnofollow #####
$all=array(); preg_match_all("/(<a .*>.*<\/a>)/Ui",$sText,$all);
foreach($all[1] as $atag){
    if(strpos($atag,$_SERVER['HTTP_HOST'])===false) $_atag="<noindex>".$atag."</noindex>";
    else $_atag=str_replace(array(" rel=\"nofollow\""," rel='nofollow'"),"",$atag);
    $sText=str_replace($atag,$_atag,$sText);
}
return $sText;
##### [hack] no_self_relnofollow #####
//return preg_replace("/(<a .*>.*<\/a>)/Ui","<noindex>$1</noindex>",$sText);
	}
0
скачайте обновленную версию, там чуток изменился код
и проверьте, чтобы у вас $_SERVER['HTTP_HOST'] — выдавал именно имя вашего домена
0
Скачал, получилось, премного благодарен!
0
У меня установлен хак добавить пользователя в стандартном редакторе Из за него где то конфликт получается и при публикации топика появляются такие предупреждения:
Notice: Undefined index: host in /public_html/classes/modules/sys_text
 Text.class.php on line 271

Notice: Undefined index: host in /public_html/classes/modules/sys_text/Text.class.php
 on line 271

Warning: Cannot modify header information - headers already sent by (output started
 at /public_html/classes/modules/sys_text/Text.class.php:271) in /public_html/include/
function.php on line 181 


Это появляется если именно в теле топика присутствует это имя юзера
Буду благодарен если подскажете где поправить. Заранее спасибо.
0
эм… ну по каким-то причинам не отрабатывает код вытаскивания УРЛа, может там относительный путь указан, в общем замените вот этот кусок кода:
if(strpos($url['host'],$_SERVER['HTTP_HOST'])===false) $_atag="<noindex>".$atag."</noindex>";
                    else $_atag=str_replace(array(" rel=\"nofollow\""," rel='nofollow'"),"",$atag);
                    $sText=str_replace($atag,$_atag,$sText);

на вот такой кусок кода:
if(is_array($url) && sizeof($url)>0){
                      if(strpos($url['host'],$_SERVER['HTTP_HOST'])===false) $_atag="<noindex>".$atag."</noindex>";
                      else $_atag=str_replace(array(" rel=\"nofollow\""," rel='nofollow'"),"",$atag);
                      $sText=str_replace($atag,$_atag,$sText);
                    }

0
Установи, работает, да не все правильно.
Дело в том, что если Вы находитесь на сайте, то вставив ссылку на одну и ту же страницу:
www.moisait.ru/page/1.html
moisait.ru/page/1.html

, то в одном случае получим «чистый» код, а в другом с noindex и nofollow

Понимаете о чем это я?
0
да, я понял о чем вы
можете это поправить сами — перед строчкой
if(strpos($url['host'],$_SERVER['HTTP_HOST'])===false) $_atag="<noindex>".$atag."</noindex>";

вставляете строчку:
$_SERVER['HTTP_HOST']=(substr($_SERVER['HTTP_HOST'],0,4)=="www.")?substr($_SERVER['HTTP_HOST'],4):$_SERVER['HTTP_HOST'];
+1
Ну понятное дело, что подправить можно. Пред. коммент был оставлен дабы исправить это недочет для будущих качающий.

А вам спасибо +1
0
Дело в том, что это на самом деле не стандратно — обычно сайт как раз имеет только один урл либо с 'www.', либо без него. Потому что с точки зрения СЕО будет дубл. контент, т.к. по двум разным адресам — будет выдаваться один и тот же контент
0
Сделал как указано, почистил кэш, попробовал заново отредактировать топик с предупреждениями — ничего не изменилось, кроме адресов строк:
Notice: Undefined index: host in /public_html/classes/modules/sys_text/
Text.class.php on line 273

Notice: Undefined index: host in /public_html/classes/modules/sys_text/
Text.class.php on line 273

Warning: Cannot modify header information - headers already sent by (output
 started at /public_html/classes/modules/sys_text/Text.class.php:273) in /
public_html/include/function.php on line 181

Не обрабатывает
<user>имя пользователя</user>
0
эм… а вы проверьте что у вас там на 273 строчке, что-то мне подсказывает, что это не мой код выдает :) он сейчас не может доходить до «undefined index: host», потому что мы сейчас там условие поставили
0
Это строка из Вашего хака, вот она:
if(strpos($url['host'],$_SERVER['HTTP_HOST'])===false)
 $_atag="<noindex>".$atag."</noindex>";
0
ясн… ладно, не люблю я конечно такие методы…
замените
$url['host']
на
@$url['host']
0
спасибо помогло, хотелось бы конечно не просто подавить вывод предупреждений, а понять почему не обрабатывает
<user>имя пользователя</user>
Но и на этом спасибо.
0
В свое время делал так:

public function MakeUrlNoIndex($sText) {

		$sText = preg_replace('#<a([^<]*)href=["\']http://(?![a-z0-9.-]*'.quotemeta($_SERVER['HTTP_HOST']).'\/)([^"\']*)["\']([^<]*)>(.*)</a>#ismU','<noindex><a$1href="http://$2"$3 rel="nofollow">$4</a></noindex>', $sText);  

		return $sText;


	}
0
  • avatar
  • Hrom
  • 08 ноября 2009, 22:37
А никто не пробовал сделать галочку «Индексировать ссылки», чтоб в определённых постах можно было оставлять ссылки открытыми. Т.е. пишу например пост о дружественном мне сайте, ссылку хочу оставить открытой (без noindex и nofollow), ставлю галочку и пост сохраняется с открытыми ссылками, в wordpress такая функция была, очень полезно. Функция должна быть доступной только админу. Здесь вот обсуждали, но никто не поддержал.
0
Добрый день.
Я прошу прощения что беспокою… Если Вас не затруднит, не подскажете как поправить вот такую ситуацию?:
у становил Ваш хак, сделал как все было указанно в топике и запустил скрипт… Мне выдало что:

Founded 438 topics with URLS
Begin to process:
1 — topic ID: 1 processed
2 — topic ID: 2 processed
3 — topic ID: 3 processed

потом доходит до

145 — topic ID: 305 processed
146 — topic ID: 307 processed

и пишет

Finished

Получается что скрипт обрабатывает не все топики… Что нужно поправить, чтобы скрипт прошелся по всем постам?

Заранее благодарен за помощь!!!
0
сделал то, что описано в посте. А как теперь проверить?
0
Не совсем тему, но возможно кого-нибудь заинтересует: Яндекс стал понимать nofollow. По сути, необходимость в невалидном теге noindex отпадает.
Более того, текст между вообще невидем для поисковика, он не попадает в индекс, что не есть хорошо с точки зрения SEO.
0
Вот измененная часть справки Яндекса.
0
Я для этого изначально все внешние ссылки сделал редиректными и с nofollow.
0
в 0.4.1 версии в файле Text.class.php вообще нет функции, которую требуется заменить.
Не знаете где она в текущей версии движка? Или там уже этим решением не обойтись?
0
ее уже не используют, т.к. яндекс стал понимать nofollow, который подставляет сам джевикс.
0
Спасибо, Lora
отстал от жизни совсем :)
0
А есть возможность переключить с джевикса на эту функцию обратно? Просто в джевиксе до ума не доведено… Не должны ссылки в рамках одного домена в nofollow идти :(
0
написать функцию отдально
0
но nofollow всё равно остался то ???!!!
как его убрать в внутренних сслылках
0
Похоже для 0.4 это не подходит, а жаль.
0
как этот хак можно переделать для 0.4?
спасибо.
0
Сайт очень понравился, сразу видно у автора есть вкус к дизайнерскому решению
Но вот по поводу хака я даже не знаю, нашёл в статье ecovoice.ru/blog/eco/2598.html ссылку на внешний ресурс "квартиры", но она по чему то не обрамляется…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.