Клоакинг редирект по рефереру

Написал PHP скрипт который отслеживает по рефереру (заголовок HTTP_REFERER), что пользователь пришел с поисковой системы, выдёргивает поисковый запрос и редиректит (автоматически перенаправляет) на нужную ссылку с этим запросом.

Удобно использовать на дорвеях. Этот код нужно вставить в начале каждой страницы дорвея:

1
2
3
4
5
6
7
8
9
10
11
<?php
if (preg_match('#google|msn|live|altavista|ask|yahoo|aol|yandex|mail\.ru|rambler#i', $_SERVER['HTTP_REFERER'])) 
{ 
    if (preg_match("#[\?\&](q|p|query|keywords|text)=([^&]+)#i", $_SERVER['HTTP_REFERER'] , $match)) 
    { 
	header("Location: http://beerhack.name/?q=".urldecode($match[2])); //впишите ссылку на которую требуется перенаправление
        die() ; 
    } 
}
?>
//тут должен быть код самой страницы

Допустим пользователь ищет в гугле «скачать opera», гугл ему предлагает страницу «http://beerhack.name/doorway/opera.php»

Результаты выдачи Google

Но когда пользователь нажимает на эту ссылку, он автоматически попадает на «http://beerhack.name/?q=скачать opera».

Клоакинг редирект

В других случаях, если пользователь просто зашел по ссылке или это поисковый робот пришел, то ему отобразится сама страница «http://beerhack.name/doorway/opera.php». Такой себе клоакинг.

Преимущества такого редиректа перед редиректами на JavaScript или безредиректных дорвеях с кнопкой в том, что нет потерь трафика на тот процент пользователей у которых отключён JavaScript и тех, кто не захотел нажимать на кнопку.

Обновлено 27.07.2012

Переписал скрипт, код ниже:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$to = 'http://beerhack.name/?q='; //впишите ссылку на которую требуется перенаправление
if (preg_match('#(google|bing|msn|ask|aol|mail\.ru|webalta).*[\?\&]q=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[2]));
	die();
}
if (preg_match('#(altavista|yahoo).*[\?\&]p=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[2]));
	die();
}
if (preg_match('#yandex.*[\?\&]text=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[1]));
	die();
}
if (preg_match('#rambler.*[\?\&]query=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[1]));
	die();
}
?>
//тут должен быть код самой страницы

Обновлено 15.01.2013

Переписал скрипт, добавил возможность перенаправления в случае если не удастся определить поисковый запрос:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$to = 'http://beerhack.name/?q='; //впишите ссылку на которую требуется перенаправление
$toDefault = 'http://beerhack.name/?q=keyword'; //если не удастся определить поисковый запрос, то перенаправить по этой ссылке
if (preg_match('#(google|bing|msn|ask|aol|mail\.ru|webalta).*[\?\&]q=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[2]));
	die();
}
if (preg_match('#(altavista|yahoo).*[\?\&]p=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[2]));
	die();
}
if (preg_match('#yandex.*[\?\&]text=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[1]));
	die();
}
if (preg_match('#rambler.*[\?\&]query=([^&]+)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$to.urldecode($match[1]));
	die();
}
if (preg_match('#(google|bing|msn|ask|aol|mail\.ru|webalta|altavista|yahoo|yandex|rambler)#i', $_SERVER['HTTP_REFERER'], $match)) {
	header("Location: ".$toDefault);
	die();
}
?>
//тут должен быть код самой страницы
26.07.2012

Комментарии:

  1. Есть одна небольшая проблема. В яндексе бывает по некоторым запросам url имеет дополнительный параметр (p), который содержит int число, то бишь url может выглядеть так http://yandex.ru/yandsearch?p=1&text=скачать опера, соответственно, так как в регулярке есть (p), то в $match[2] попадет именно число, а не запрос.
    + еще у меня заходят с некой пс webalta.

    Ответить
  2. Scofield, спасибо, а то я как-то не замечал, что у яндекса такое есть. Решение вижу пока что только поставить костыль, отдельную регулярку для яндекса.

    Ответить
  3. Сам не сразу заметил, а через время, когда зашел в админке в раздел кеи и потом увидел, что в запросах присутствуют просто цифры.

    Ответить
  4. Переписал скрипт, добавил код в статью ниже.

    Ответить
  5. Параметр p оказывается просто показывает номер страницы с которой зашли. Как-то на него внимание даже не обращал.

    Ответить
  6. Можно еще куку закидывать юзеру, чтобы зафильтровать хитробота. Хотя, не исключено, что он и куки обрабатывает.

    Ответить
  7. e2e4, а интересная идея. Надо попробовать ставить куку, а потом проверку делать: если поставилась – юзер, не поставилась – бот. Хотя да, надо проверить, вдруг бот куки тоже принимает.

    Ответить
  8. Есть реализация всего вышесказанного на js, могу поделиться.

    Ответить
  9. e2e4, уже использовал этот js редик, как Яндекс реагирует?

    Ответить
  10. Бирхак, ты его сейчас и используешь? Нормально все?

    Ответить
  11. GrW, использую, нормально.

    Ответить
  12. e2e4, поделитесь, пожалуйста ява скриптом)

    Ответить
  13. Клоакинг – это подмена контента без редиректа, прошу не путать.

    Ответить
  14. Алексей, всё правильно я написал, редирект — это тоже своего рода контент. Так что не путайте вы.

    Ответить
  15. Подскажите плиз – этот код вставлять в тэг Хеда или после БОДИ ?
    и как с счётчиком liveinternet’ом он работает – или он уже ненужен? :)

    Ответить
  16. anton, вставляете до тега html. Счетчик нет смысла ставить, он не успеет сработать.

    Ответить
  17. Есть один неприятный нюанс – все кто авторизованы в гугле приходят по https с пустым рефером и отправляются вслед за ботом. Есть какое-то решение дабы не терять огромный кусок трафика?

    Ответить
  18. Владимир, там не пустой реферер, но да, поисковый запрос он не содержит. Можно по дефолту на какой-то один стандартный урл перенаправлять.

    Ответить
  19. Опишите в двух словах, пожалуйста, как отделить такого юзера от бота, или то,что вы имеете ввиду. Я думаю это решение необходимо абсолютно всем.

    Ответить
  20. Владимир, дописал скрипт и обновил выше. Пробуйте.

    Ответить
  21. Бирхак , большое спасибо!

    Ответить
  22. Бирхак как вы фильтруете юзеров и ботов? Как мне известно в наше время боты по юзерагенту могут выглядеть как обычные пользователи.
    Как долго с таким скриптом дор живет в топе? Какая вероятность бана?

    Ответить
  23. И еще не хотелось бы терять пользователей, которые перейдут к нам на страницу при помощи сторонних ссылок, спама и тп.

    Ответить
  24. boris, тогда Вам подойдёт просто редирект без проверки реферера)

    Ответить
  25. Подробнее плиз. Разве это убережет от бана? С простыи редиректом сколько проживет дор?))

    Ответить
  26. а что если нужно реализовать вот такое: если зашел бот – то просто выдается страничка дорвея , если же зашел посетитель с поисковика или же ПРОСТО по ссылке с блога или форума(ЧТОБЫ не терять траффик НЕ с поисковиков), то нужно выждать 5 секунд ПЕРЕНАПРАВИТЬ его на любую страничу дорвея а потом уже РЕДИРЕКТИТЬ на прокладку например – можешь с учетом этого внести исправления и показать код пожалуйста.

    P.S. бирхак а ты в аське вобще отвечаешь ?

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

    Ответить
  28. pub, всё можно) Отвечаю если есть личная заинтересованность, если пишут сразу, что хотят, если мне понравится идея, то обычно делаю для себя, а потом делюсь с другими.

    Ответить
  29. я так понял если скрипт с этой странички используешь то уже нет особой надобности в том скрипте , который по айпи и юзерагенту определяет ? получается если на дор придет бот, то скрипт не определит его как перешедшего с поисковика? поисковые боты не по ссылкам с ПСов разве переходят?

    Ответить
  30. pub, да, боты ПС приходят без реферера.

    Ответить
  31. поскольку я не знаком с пхп спрошу у тебя тогда: как тогда подредактировать скрипт чтобы он делал это: если бот то остается на страничке, если же человек – скрипт ждет 5 секунд потом кидает его на другую страничку на этом же доре а потом уже с нее на другой сайт/тдс/прокладку – можно такое реализовать?

    Ответить
  32. pub, да честно говоря вариантов можно кучу придумать, а вот сделать что-то универсальное и опционально настраиваемое вряд ли получится, да и не нужно это, лучше делать конкретно под то, что нужно, как вот в этой статье – редирект чисто на основе анализа реферера. В принципе могу сделать то, что ты просишь, так, что можешь написать мне на эмэйл здесь http://beerhack.name/contact указав ещё раз точное и подробное ТЗ со всеми особенностями которые тебе нужны, а я тебе отвечу точной ценой и сроками написания.

    Ответить
  33. pub, как думаешь такая цепочка редиректа, которую ты предлагаешь реализовать, сохранит дорвей от бана? и как определить бот или юзер пришел? у бота юзерагент может быть такой же как у обычного юзера, все айпишники отследить невозможно и неизвестно как часто меняются айпи

    Ответить
  34. А почему на php? Таки неудобно на дорах юзать, на дорах пхп особо не используют.

    Ответить
  35. boris, я всё больше убеждаюсь, что то, что якобы гуглбот заходит с юзерагентом обычного пользователя — миф.

    Ответить
  36. b82a, уж поверь, пхп на дорах юзают крутые поцыки и там системы серьёзные, у меня так вообще уже целый комбайн из разных наработок.

    Ответить
  37. Бирхак, спасибо за скрипт!
    Такой вопрос – имеет ли смысл ставить редирект сначала на пустую страницу со счетчиком, а затем оттуда уже такой же php редирект уже куда надо?
    Просто вот думаю, как объять необъятное – и редиректить, и li счетчик тоже задействовать, чисто для удобства статистики.

    Ответить
  38. rokugan, так li счетчик не сработает если редирект будет на php.

    Ответить
  39. Бирхак, не подскажешь, с помощью php можно отлавливать наличие курсора на странице? Если да, в какую сторону копать? Теоретически ведь боты не должны эмулировать курсор, не нужен он им.

    Ответить
  40. forest, с помощью PHP нельзя, с помощью JS можно.

    Ответить
  41. А аналог сишной функции GetCursorInfo, возвращающей булеву, у js есть? Всё что удалось нарыть это определение координат курсора, всё не то:(

    Ответить
  42. forest, почитай про события мыши http://javascript.ru/tutorial/events/mouse mousemove наверное подойдёт тебе.

    Ответить
  43. Поставил скрипт от 15.01.2013 на дор и нифига не дерагет почему то кей с гугла. По разным кеям заходил на дор и ничего((

    Ответить
  44. Тупо редиректит на прокладку с «запасным кеем» но нах запасной то нужен

    Ответить
  45. Только что проверил, не передает кей с гугла(хотя я вышел из акка гугла), с яндекса вроде нормально кей на прокладку передается.

    Ответить
  46. Денис, если с гугла через https переходишь, то кей не передаётся.

    Ответить
  47. Бирхак,спасибо за этот чудесный скрипт.Пользуюсь ним уже несколько месяцев ,работает норм,с гуглом конечно беда из за https но я с ним не особо и дружу.
    Есть просьба,добавить в скрипт функцию чтоб ссылка бралась с файла.
    Сам пробовал но чет не получается,плохой с меня прогер)

    Ответить
  48. Александр, замени строчку на $to = file_get_contents(‘file.txt’);

    Ответить
  49. Ещё раз спасибо за скрипт и за то, что поддерживаешь его.
    Подскажи, пожалуйста: сливаю на тдс и постоянно вижу, что почти весь траф с яндекса приходит с рефером в таком виде
    http://yandex.ru/yandsearch?text=домендора1.ру&lr=213
    http://yandex.ru/yandsearch?text=домендора2.ком&lr=213,
    соответственно кеи дергаются «домендора1.ру» и т.д.
    Вроде скрипт не при чём, а что с этим делать не понятно.

    Ответить
  50. Владимир, значит ищут домены такие, если нет, то даже не знаю.

    Ответить
  51. Обнаружил, что при заходе на https гугл с любым мобильным юзер агентом, гугл передаёт пустой реферер, что с учетом того, что доры ориентированы на wap весьма печально. Интересно было бы узнать какой процент пользователей теряется.

    Ответить
  52. Подскажите,можно как то отфильтровать такой рефер
    http://yandex.ru/yandsearch?text=domen.net&lr=213 ?
    Очень много ботов идут под таким рефером с яндекса.
    Где то читал что это проверка на клоку.

    Ответить
  53. Александр, никак лучше не фильтровать их, а то можно и реальных пользователей отсеять.

    Ответить
  54. Яндекс сейчас по новому начал работать
    Если раньше было так http://yandex.ru/yandsearch?text=кей
    То сейчас в тдс отображается вот так http://yandex.ru/clck/jsredir?from=кей

    Ответить
  55. Бирхак,сори задам вопрос еще раз,где нужно прописать чтоб отфильтровать этот рефер? yandex.ru/yandsearch?text=
    Реальные юзеры уже не ходят под этим рефером а только боты.
    Подскажите, очень нужно.

    Ответить
  56. Или есть возможность отфильтровать по реферу?
    Как то отфильтровать если в рефере присутствует зоны (.net .org .ru .com .biz) то показать дорвей.
    Идут запросы в таком виде с разных ip,и не с одной подсети.
    yandex.ru/yandsearch?text=domen.net
    yandex.ru/yandsearch?text=domen.com
    yandex.ru/yandsearch?text=domen.biz
    На главную домена.

    Ответить
  57. хром палит и по ходу стучит что обнаружен циклический редирект :(

    Ответить
  58. не совсем понял где в этом скрипте указывать ключевики.

    Например, хочу только по определенному запросу редиректить

    Помоги плиз. спасибо.

    Ответить
  59. Спасибо за код, долго искал и нашел на серче ссылку на ваш сайт…

    Ответить