Я хочу скрыть реферер, когда я нажимаю ссылку на своем веб-сайте. Чтобы лучше понять, что я хочу сделать: когда кто-то нажимает ссылку на моем сайте, я не хочу, чтобы другой владелец веб-сайта знал, откуда пришел посетитель.
Мне все равно, если это делается с помощью PHP, HTML или Javascript.
Я попытался с обновлением HTML, javascript window.location, всплывающим окном javascript, перенаправлением заголовка PHP, но ничего не получилось.
Мы используем простой скрипт, который мы разработали для внутренней системы задач. Мы не хотим передавать информацию о реферерах! Когда я смотрю другие веб-сайты, которыми мы управляем, я не вижу никакой информации о реферере, переданной с запросом при использовании скрипта, но без сценария, который я делаю.
<?php // anonym.to.php // Redirect URLs so the referrer information is dropped. Ideally, this script would be // invoked by prefixing all external links like this: "/anonym.to.php?URL" // If a query string is given, then assume it is a website // and anonymously redirect to it. if ($_SERVER['QUERY_STRING']) { header('Location: '.$_SERVER['QUERY_STRING']); exit(0); } ?>
Вот глупый доказательство этого. Я использую этот скрипт в приложении, которое иногда ссылается на сторонние веб-сайты со страниц, URL-адреса которых должны храниться конфиденциально.
<?php session_start(); /** Setp 1. Get the query string variable and set it in a session, then remove it from the URL. */ if (isset($_GET['to']) && !isset($_SESSION['to'])) { $_SESSION['to'] = urldecode($_GET['to']); header('Location: http://yoursite.com/path/to/this-script.php');// Must be THIS script exit(); } /** Step 2. The page has now been reloaded, replacing the original referer with what ever this script is called. Make sure the session variable is set and the query string has been removed, then redirect to the intended location. */ if (!isset($_GET['to']) && isset($_SESSION['to'])) { $output = '<!DOCTYPE html> <html> <head> <meta name="robots" content="none"> <title>Referral Mask</title> </head> <body> <h3>Redirecting...</h3> <script>window.location.href="'.$_SESSION['to'].'"</script> <a href="'.$_SESSION['to'].'">Here is your link</a> </body> </html>' . "\n"; unset($_SESSION['to']); echo $output; exit(); } ?> <!DOCTYPE html> <html> <head> <meta name="robots" content="none"> <title>Referral Mask</title> </head> <body> <h1>Referral Mask</h1> <p>This resource is used to change the HTTP Referral header of a link clicked from within our secure pages.</p> </body> </html>
с<?php session_start(); /** Setp 1. Get the query string variable and set it in a session, then remove it from the URL. */ if (isset($_GET['to']) && !isset($_SESSION['to'])) { $_SESSION['to'] = urldecode($_GET['to']); header('Location: http://yoursite.com/path/to/this-script.php');// Must be THIS script exit(); } /** Step 2. The page has now been reloaded, replacing the original referer with what ever this script is called. Make sure the session variable is set and the query string has been removed, then redirect to the intended location. */ if (!isset($_GET['to']) && isset($_SESSION['to'])) { $output = '<!DOCTYPE html> <html> <head> <meta name="robots" content="none"> <title>Referral Mask</title> </head> <body> <h3>Redirecting...</h3> <script>window.location.href="'.$_SESSION['to'].'"</script> <a href="'.$_SESSION['to'].'">Here is your link</a> </body> </html>' . "\n"; unset($_SESSION['to']); echo $output; exit(); } ?> <!DOCTYPE html> <html> <head> <meta name="robots" content="none"> <title>Referral Mask</title> </head> <body> <h1>Referral Mask</h1> <p>This resource is used to change the HTTP Referral header of a link clicked from within our secure pages.</p> </body> </html>
Этот скрипт использует PHP и JavaScript для надежного удаления исходного реферера из заголовков.
С 2015 года вы предотвращаете отправку заголовка Referer:
<meta name="referrer" content="no-referrer" />
Просто добавьте это в раздел заголовка веб-страницы. Работает как для ссылок, так и для запросов Ajax.
Обход, а не решение:
генерировать все такие ссылки через tinyurl.com или аналогичную услугу.
Возьмем <url>
вы хотите перенаправить, и введите raw-url-encode. Создайте некоторую случайную строку из 10-15 символов (чтобы обеспечить ее доступность), чтобы не называть ее <alias>
.
Затем вызовите http://tinyurl.com/create.php?alias=<alias>&url=<url>
Например http://tinyurl.com/create.php?alias=ahdiwabdoubiadasd&url=http%3A%2F%2Fwww.whatismyreferer.com%2F
Теперь вы можете проверить, что http://tinyurl.com/ahdiwabdoubiadasd ведет на http://www.whatismyreferer.com с перенаправленным реферером
В дополнение к ответу jimps я создал однофайловое решение .php, которое будет работать как с HTTPS, так и с HTTP. Он использует два шага (и поэтому он будет вызывать anonym.php дважды). Сначала перенаправление javascript, во-вторых, перенаправление адреса заголовка php. Я лично нуждался в этом, чтобы тестировать размещенные URL-адреса из области администрирования. Наслаждайтесь!
<?php // anonym.php if ($_SERVER['QUERY_STRING']) { if (stripos($_SERVER['QUERY_STRING'], 'anonym2=') === FALSE) { echo '<script>document.location.replace("anonym.php?anonym2=' .$_SERVER['QUERY_STRING']. '");</script>'; } else { header('Location: ' . str_replace('anonym2=', '', $_SERVER['QUERY_STRING'])); } exit(); } ?>
В дополнение к
В HTML 5 ссылки должны поддерживать rel="noreferrer"
для этой цели.
Вы можете сделать все ваши ссылки пройденными через перенаправление прокси или ссылку на сокращение (например, bit.ly или goo.gl), но это может вызвать некоторые брови среди пользователей.
Вы также можете (опять же, не рекомендуется) заменять гиперссылки на те, которые вызывают обратную передачу на стороне сервера и программно «конструируют» заголовки перед отправкой запроса.
На мой взгляд, все немного переборщило.
Вот моя попытка резервного решения с использованием пустого iframe. Я не получил работу, но я делюсь ею, если кто-то еще захочет поиграть с ней. Технически кадр имеет кросс-начало, поэтому вы не можете просто щелкнуть ссылку в кадре. Моя мысль заключалась в том, чтобы использовать postMessage, чтобы сделать сам кадр.
https://jsfiddle.net/skibulk/0oebphet/39/
(function($){ var frame = $('<iframe src="about:blank" style="displayyyy: none !important;">').appendTo('body'); $('a[rel~=noreferrer]').click(function(event){ var win = frame[0].contentWindow; win.$ = $; frame .contents() .find('body') .append(event.target.outerHTML) .append( "<scr\ipt> window.addEventListener('message', function(event){ document.append(event.data); $('a').click(); }); </scr\ipt>" ); win.postMessage('Hi','*'); return false; }); })(jQuery);