В различного рода работе (партнерки, лендинги и т. п.) нередко возникает вопрос — как переадресовать пользователя на другую веб-страницу, при этом чтобы его браузер не передавал HTTP Referer. В Интернете существует множество сервисов, которые просто заменяют Referer на свой собственный адрес, но это тоже не всегда желаемо. Так как же получить пустой Referer?
Есть один самый надежный путь:
1. Переадресовываем пользователя на HTTPS-адрес.
2. Далее, если целевой адрес HTTP, то переадресовываем туда.
3. Иначе, переадресовываем на наш HTTP-адрес, а оттуда уже на целевой.
Эта схема гарантированно очистит Referer, однако, она достаточно муторная и иногда требует нескольких редиректов.
Если же у вас нет возможности организовывать такую схему, или вы просто не хотите слишком париться на этот счет, или даже просто интересуетесь, какие есть еще способы, то эта заметка для вас. Я расскажу, как получить максимально кроссбраузерное решение, которое переадресует пользователя на целевую страницу с пустым реферером.
Разумеется, совершить редирект, отослав браузеру заголовок (с кодом 301 или 302, например) не получится, так как браузер в этом случае удержит реферер, но не обнулит его, и даже не изменит. Придется делать решение, совмещающее в себе различные подходы. Итак, сначала я приведу код, а потом — пояснения по нему.
<!--?php //Ваша ссылка, на которую осуществляется редирект $target_link = 'http://google.com'; if(!isset($_SERVER['HTTP_REFERER'])) { //Если нам никто реферер не передал, то достаточно //просто совершить 301 редирект - браузер при этом реферера навешивать //не будет //Неплохо бы еще проверить, если у нас редирект с HTTPS на HTTP, то также //осуществляем 301 редирект через header(), так как браузер //в таком случае не передаст реферер, но эту простую задачку //я оставлю вам. header('Location: ' . $target_link, true, 301); exit(); } //А иначе всё не так просто $target_link = htmlspecialchars($target_link); //Будем делать редирект через тег <meta>. //Это срабатывает в Firefox и IE, однако, в других браузерах не работает. //В то же время, браузеры на движке WebKit //(Safari, Chrome, новая Opera) поддерживают //атрибут rel="noreferrer" у тегов <a> $is_webkit = isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'webkit') !== false; if($is_webkit) { //Ставим таймаут редиректа через тег <meta> в 3 секунды //(на тот случай, если в браузере выключен JavaScript). //Это, конечно, не удалит реферера, зато заменит его //на URL этого скрипта и переадресует пользователя //на целевую страницу. $meta_timeout = 3; //Пробуем осуществить редирект с помощью JavaScript. //(Это очищает Referer). $onload = 'onload="redirect();"'; } else { //Firefox и IE и так не шлют реферер при редиректе через //тег <meta>, поэтому нам не нужны извращения через JavaScript. $meta_timeout = 0; $onload = ''; } echo <<<HERE <!doctype html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" ?--> <script type="text/javascript"> <!-- var redirect = function() { document.getElementById("link").click(); } --> </script> <a id="link" href="$target_link" rel="noreferrer"></a> HERE;
Много комментариев дано прямо в коде, но я поясню поподробнее. В скрипте скомбинировано два разных подхода к переадресации в зависимости от браузера:
1. META-редирект. Хорошо работает в Firefox и IE, очищая поле Referer.
2. Редирект через JavaScript методом программного клика по ссылке с атрибутом rel=»nofollow». Это работает в последних версиях браузеров, основанных на движке WebKit (Chrome, Safari, новая Opera). На случай, если JavaScript отключен, через 3 секунды будет осуществлен META-редирект. Это не очистит поле Referer в перечисленных браузерах, но, как минимум, заменит его и в любом случае осуществит переадресацию.