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

На досуге обнаружил, что чуток неправильно работает режим скрытия линков от поисковиков(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», если будут серъезные предложение или замечания — рассмотрю

65 комментариев

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

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

Founded 255 topics with URLS
Begin to process:

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

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


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

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:"";
)


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

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


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

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

Ну пускай тогда хоть новые посты будут с не ноиндекными тэгами… И на том спасибо! :-)
avatar
По внутренним ссылкам:
где домен прописан с www — все путем, где без www — обрамляет по полной.
Как быть?
avatar
del.
avatar
Спасибо! Как раз этого не хватало.
avatar
Спс, радует. Только на слабых серваках и дешевых тарифах (как у меня) не хаватет тайма на большие статьи, что бы переписать линки. Надо время таймаута приподнять :) Но это я так, как дополнение
avatar
там добавлен таймаут, стоит строчка: set_time_limit
avatar
насколько я понял, такой линк он тоже откроет: google.com#livestreet.ru
avatar
угу, спасибо — согласен баг, как исправлю обновлю
avatar
обновил, теперь можно юзать без опасений
avatar
офтоп: жду по 30 секунд пока на странице загрузится блок яндекс директ, а в след за ним и комментарии
avatar
а моя доработка тут причем?
она один раз отрабатывает при добавлении топика, дальше уже все из кэша или БД берется
avatar
Что-то у меня не выходит, даже при создании новых топиков с сылками, всё равно закрывает и свои и чужие, посмотрите пожалуйста, правильно ли код у меня получился:
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);
	}
avatar
скачайте обновленную версию, там чуток изменился код
и проверьте, чтобы у вас $_SERVER['HTTP_HOST'] — выдавал именно имя вашего домена
avatar
Скачал, получилось, премного благодарен!
avatar
У меня установлен хак добавить пользователя в стандартном редакторе Из за него где то конфликт получается и при публикации топика появляются такие предупреждения:
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 


Это появляется если именно в теле топика присутствует это имя юзера
Буду благодарен если подскажете где поправить. Заранее спасибо.
avatar
эм… ну по каким-то причинам не отрабатывает код вытаскивания УРЛа, может там относительный путь указан, в общем замените вот этот кусок кода:
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);
                    }

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

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

Понимаете о чем это я?
avatar
да, я понял о чем вы
можете это поправить сами — перед строчкой
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'];
avatar
Ну понятное дело, что подправить можно. Пред. коммент был оставлен дабы исправить это недочет для будущих качающий.

А вам спасибо +1
avatar
Дело в том, что это на самом деле не стандратно — обычно сайт как раз имеет только один урл либо с 'www.', либо без него. Потому что с точки зрения СЕО будет дубл. контент, т.к. по двум разным адресам — будет выдаваться один и тот же контент
avatar
Сделал как указано, почистил кэш, попробовал заново отредактировать топик с предупреждениями — ничего не изменилось, кроме адресов строк:
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>
avatar
эм… а вы проверьте что у вас там на 273 строчке, что-то мне подсказывает, что это не мой код выдает :) он сейчас не может доходить до «undefined index: host», потому что мы сейчас там условие поставили
avatar
Это строка из Вашего хака, вот она:
if(strpos($url['host'],$_SERVER['HTTP_HOST'])===false)
 $_atag="<noindex>".$atag."</noindex>";
avatar
ясн… ладно, не люблю я конечно такие методы…
замените
$url['host']
на
@$url['host']
avatar
спасибо помогло, хотелось бы конечно не просто подавить вывод предупреждений, а понять почему не обрабатывает
<user>имя пользователя</user>
Но и на этом спасибо.
avatar
В свое время делал так:

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;


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

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

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

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