"Туннелирование" ссылок
Задача такова:
Есть яваскрипт на стороне пользователя в виде расширения для FF. Этот скрипт находит ссылки на определенные сайты на произвольных, загруженных пользователем страницах. Эта часть задачи выполнена.
Далее нужно, чтобы при нажатии на найденную ссылку пользователь был направлен по исходному адресу ссылки, но через другой сайт. Через некий буфер или туннель. Цель в том, чтобы замаскировать адрес исходной страницы, с которой пользователь пришел по ссылке. Конечный сайт должен видеть только адрес буферного сайта.
Посоветуйте, пожалуйста, возможные методы решения. На чем лучше писать скрипт для буферного сайта? Может, есть какие-то стандартные заготовки?
Буду рад любым подсказкам, так как не очень представляю, как подступиться к решению.
Спасибо!
P.S. Надеюсь, не слишком коряво объяснил.
Цель в том, чтобы замаскировать адрес исходной страницы, с которой пользователь пришел по ссылке. Конечный сайт должен видеть только адрес буферного сайта.
Делай как это делают яндекс или гугл. Или как на free-lance.ru при переходе по внешней ссылке. Т.е. через перенаправление (редирект). Ссылка должна просто вести на твой сайт в духе http://example.com?go_uri=example.org, а он уже через 303 редирект должен перенаправлять на go_uri адрес (курить в сторону header функции в PHP и 303-ого статуса).
if (isset($_GET['go_uri']) && preg_match('~^[a-z0-9]+://[-a-z0-9.]+(?::\\d+)?(?:/[-a-z0-9\\~!@#$%\\^&*()_=+\\[\\]{};:|/,.?]*)?$~i', $_GET['go_uri'])) {
header('Location: ' . $_GET['go_uri']);
exit;
}
?>
Работает.
Но я так понял, что в этом случае вообще теряется информация, откуда пользователь пришел на конечную страницу. А можно сделать так, чтобы было известно, что он пришел из "туннеля"?
Но я так понял, что в этом случае вообще теряется информация, откуда пользователь пришел на конечную страницу.
Ни чего не теряется. Браузер пошлет весь комплект заголовков + в referer будет адрес твоего сайта, который типа "туннель". В общем ставь опыты, смотри логи веб сервера.
Смотрю в браузере свойства страницы. Если напрямую переход, то указан URL ссылающейся страницы, а если через "туннель", нет этой строчки почему-то. Или это не показатель? Я просто не знаю, откуда эта информация у браузера. С сервера или из своих внутренних логов?
Какой "этой"? О_о
Должно быть: страница на сайте источнике src.example/index.html на которой есть ссылки; через JS все эти ссылки изменяются с http://dst.example/... на http://tunnel.example/index.php?go_uri=http%3A%2F%2Fdst.example%2F... (это нужно спец символы эскейпить) при этом index.php делает 303 редирект на адрес указанный в go_uri. При этом в логах веб сервера dst.example (который в go_uri) будет указан referer на tunnel.example, а не на src.example
Может конечной?
То, что будет видно в строке состояние (по крайне мере в Opera она так называется) на ссылках перебитых через JS зависит от браузера. По идее при правильной реализации там должен быть адрес "туннеля".
Тогда вообще не понял, что тут за схема. Причем тут страница, с которой пришел пользователь О_о "Начальной" считаем страницу "...произвольных, загруженных пользователем страницах..." на которой подружается JS и изменяет ссылка на этой начальной странице. Каким тут боком страницы с которых пользователь пришел?
В общем, убедишь, что точно понимаешь, чего хочешь достичь и определись в используемой терминологии.
Теперь перебиваем все ссылки на start.ru на http://tunnel.org?go_uri=end.com. Тыкаем на ссылку. После "туннелирования" открывается end.com. Опять смотрим свойства страницы, строки "ссылающийся URL " нет, хотя ожидалось, что будет "ссылающийся URL tunnel.org".
Вот я и обеспокоился, почему так?
Сейчас специально взял FF и проверил. Там есть ссылающийся URL. Если его нет в твоем случае, значит ты что-то сделал не так или чего то не учел (возможно причина в локально загруженном JS и ограничениям безопасности, тут документация по FF с гуглом тебе в мощь). Рекомендую посмотреть как это выполнено тут: http://www.free-lance.ru/projects/?pid=926431
А это я не знаю. Если у тебя при переходе по ссылке которая находится в описание проекта на фрилансе в FF этот факт видно (у меня видно), а в случае с твоим скриптом нет, то проблема в реализации. Если не видно в обоих случаях, проблема в FF.
Ни что тебе не мешает конечную страницу указать на твой же сервер и после этого изучить лог веб сервера с тем, что бы понять, если там referer или нет. Или воспользоваться сетевым сниферов в духе wireshark.
Не бывает ни простых редиректов, ни сложных. И переходов полноценных и не полноценных тоже нет. Что за расизм :D
Ссылку на фриланс с примером такого "туннелирования" я привел. Там все работает как и ожидается. Если у тебя получает не так, то видимо проблема все же в твоей реализации.
Когда JS через DOM изменяет ссылку А на ссылку Б, то при клике на измененной ссылки получаем "пользователь кликнул по ссылке", перешел на страницу сайта-туннеля, оттуда отредиректился на сайт С. На сайте С у referer получаем адрес страницы сайта-туннеля.И это схема работает. Единственный камень который тут может возникнуть это ограничение безопасности самого браузера, но на сколько я помню в данном случае оно не должно возникать, но возникнуть может. Попробуй для теста реализовать данную схему использую не локальный JS, а загруженный вместе со страницей сайта.
По поводу последнего - уверен? Я сейчас этого точно не знаю, а тестить лень как-то, но по-моему, если
1. Пользователь открыл страницу А
2. Со страницы А перешёл по ссылке, ведущий на страницу Б
3. Страница Б отредиректила браузер на страницу В
то сервер страницы В получит информацию, что реферер - страница А.
Либо вообще никакого реферера не получит.
По поводу последнего - уверен? Я сейчас этого точно не знаю, а тестить лень как-то, но по-моему, если
1. Пользователь открыл страницу А
2. Со страницы А перешёл по ссылке, ведущий на страницу Б
3. Страница Б отредиректила браузер на страницу В
то сервер страницы В получит информацию, что реферер - страница А.
Либо вообще никакого реферера не получит.
Уверен. Сервер страницы В получить в реферере адрес страницы Б и ни каким боком он не может получить в реферерах страницу А. Хочешь убедиться - отбрось лень и проверь.