Редирект без http referer

Редирект без http referer

В различного рода работе (партнерки, лендинги и т. п.) нередко возникает вопрос — как переадресовать пользователя на другую веб-страницу, при этом чтобы его браузер не передавал 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); //Будем делать редирект через тег &lt;meta&gt;. //Это срабатывает в Firefox и IE, однако, в других браузерах не работает. //В то же время, браузеры на движке WebKit //(Safari, Chrome, новая Opera) поддерживают //атрибут rel="noreferrer" у тегов &lt;a&gt; $is_webkit = isset($_SERVER['HTTP_USER_AGENT']) &amp;&amp; strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'webkit') !== false; if($is_webkit) { //Ставим таймаут редиректа через тег &lt;meta&gt; в 3 секунды //(на тот случай, если в браузере выключен JavaScript). //Это, конечно, не удалит реферера, зато заменит его //на URL этого скрипта и переадресует пользователя //на целевую страницу. $meta_timeout = 3; //Пробуем осуществить редирект с помощью JavaScript. //(Это очищает Referer). $onload = 'onload="redirect();"'; } else { //Firefox и IE и так не шлют реферер при редиректе через //тег &lt;meta&gt;, поэтому нам не нужны извращения через JavaScript. $meta_timeout = 0; $onload = ''; } echo &lt;&lt;&lt;HERE &lt;!doctype html&gt; &lt;html&gt; &lt;head&gt; &lt;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 в перечисленных браузерах, но, как минимум, заменит его и в любом случае осуществит переадресацию.

ОСТАВЬТЕ ОТВЕТ