Редирект без HTTP Referer

redirect

В различного рода работе (партнерки, лендинги и т.п.) нередко возникает вопрос - как переадресовать пользователя на другую веб-страницу, при этом чтобы его браузер не передавал HTTP Referer. В Интернете существует множество сервисов, которые просто заменяют Referer на свой собственный адрес, но это тоже не всегда желаемо. Так как же получить пустой Referer?

Есть один самый надежный путь:
1. Переадресовываем пользователя на HTTPS-адрес.
2. Далее, если целевой адрес HTTP, то переадресовываем туда.
3. Иначе, переадресовываем на наш HTTP-адрес, а оттуда уже на целевой.

Эта схема гарантированно очистит Referer, однако, она достаточно муторная и иногда требует нескольких редиректов.

Если же у вас нет возможности организовывать такую схему, или вы просто не хотите слишком париться на этот счет, или даже просто интересуетесь, какие есть еще способы, то эта заметка для вас. Я расскажу, как получить максимально кроссбраузерное решение, которое переадресует пользователя на целевую страницу с пустым реферером.

Разумеется, совершить редирект, отослав браузеру заголовок (с кодом 301 или 302, например) не получится, так как браузер в этом случае удержит реферер, но не обнулит его, и даже не изменит. Придется делать решение, совмещающее в себе различные подходы. Итак, сначала я приведу код, а потом - пояснения по нему.

Много комментариев дано прямо в коде, но я поясню поподробнее. В скрипте скомбинировано два разных подхода к переадресации в зависимости от браузера:
1. META-редирект. Хорошо работает в Firefox и IE, очищая поле Referer.
2. Редирект через JavaScript методом программного клика по ссылке с атрибутом rel="nofollow". Это работает в последних версиях браузеров, основанных на движке WebKit (Chrome, Safari, новая Opera). На случай, если JavaScript отключен, через 3 секунды будет осуществлен META-редирект. Это не очистит поле Referer в перечисленных браузерах, но, как минимум, заменит его и в любом случае осуществит переадресацию.

Вот и все пояснения по этому решению. Надеюсь, кому-то будет полезно.

Обновление от октября 2017 года: в этом году появился новый серверный заголовок, который позволяет выключить передачу реферера даже при редиректе с HTTP-ресурса на другой HTTP-ресурс, либо при редиректе с HTTPS на HTTPS. Это Referrer-Policy, который, впрочем, пока что поддерживается малым количеством браузеров. Однако, для профилактики можно отсылать этот хедер из PHP-скрипта перед отсылкой заголовка Location. Я добавил его отправку в скрипт-пример, который опубликован выше по тексту.

Редирект без HTTP Referer: 21 комментарий

  1. Очень интересная статья, вообще ваш сайт один не из многих где есть полезная информация и в понятном виде для любого читателя, жаль что только редко пополняется сайт статьями.
    Ещё такой вопрос, может вы могли-бы написать статью с примерами уникальной многофункциональной клоаке.
    С Функциями: фильтрация поисковых ботов по списку IP адресов, определения ботов в реальном времени, возможность фильтровать по юзер-агенту.

    С Ув. Алекс.

    1. Изменить реферер на произвольный - сомнительно. Если только использовать какие-то уязвимости браузеров (но такие сложно обнаружить, да и не стоит оно того).

  2. А как сделать, чтобы перебрасывая через редирект, передать через него 1 или несколько нужных мне GET параметров?

    Пример:
    Пользователи с рекламной площадки(условно назовем его сайт http://САЙТ1.ru/ переходит по ссылке вида http://САЙТ2.ru/?param1=643213&param2=sj2823&param3=546_sq87 (значения param1, param2 и param3 для каждого пользователя задаются динамически)

    Мне нужно что бы редирект, размещенный на http://САЙТ2.ru/ переадресовывал пользователя на конечный сайт партнерки (http://САЙТ3.ru/), при этом "на ходу" подставлял в конец ссылки текущие значения GET. Т.е. пользователь уходил по ссылке вида:

    http://САЙТ3.ru/?SubID=%5Bparam3%5D&refIP=%5Bparam1%5D

  3. Спасибо за ред с коммами внутри.
    А если вставить ред в ссылку на которую осуществляется редирект типа
    $target_link = 'http://anonimus.to?ссылка';
    По сути реферер должен быть anonimus.to!?

  4. С https не совсем ясно. Можно просто использовать header Location php? И как он работает? Например при переходе на мой https сайт, а потом с моего куда либо, какой будет реферер? Разве с помощью php поменяется реферер?

  5. Очень ценная инфа!
    Но что то не получается умну реализовать http -> https -> http, реферер не стирается :(
    dx, подскажи пжлст, какой именно редирект должен быть на промежуточном сайте с https
    Пробовал php редирект, через htaccess, но не получается, реферер остается прежним :( вторые сутки сижу с этой проблемой. Сертификат установлен корректно.

    1. При редиректе с HTTPS на HTTP браузер должен по требованиям RFC не передавать реферер. Это указано вот здесь: https://tools.ietf.org/html/rfc7231#section-5.5.2 : A user agent MUST NOT send a Referer header field in an unsecured HTTP request if the referring page was received with a secure protocol. Если все сделано правильно, то реферер с HTTPS на HTTP-сайт передаваться не должен. Советую попробовать в другом браузере, возможно, это проблема конкретного браузера.

    1. Так в статье же код выложен. Я ничего нового с тех пор не придумывал. Редирект нужно делать отправкой заголовка Location от веб-сервера.

    2. Вот я написал код:

      Залил на https://kaimi.io/, перешел по адресу, реферера нет.

      Сейчас нашел еще появившийся недавно заголовок Referrer-Policy, который позволяет осуществить редирект без реферера даже на http-сайт. Вот полный пример:

      Первая ссылка будет редиректить на google с передачей реферера, а вторая и третья - без. Нужно учесть, что хедер Referrer-policy поддерживают далеко не все браузеры (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#Browser_compatibility), поэтому пока что редирект с HTTPS на HTTP остается самым надежным вариантом.

  6. Если перейти по ссылке расположенной на сайте https на сайт с http, реферер будет пустой, этто да. Но при редиректе, когда ссылка стоит на сайте с http, с нее переход на сайт с https, оттуда редирект header('Location: на сайт http, реферер сохраняется ведь :(

    1. Действительно, Firefox, например, в таком сценарии реферер передает. Нужно в таком случае комбинировать методы. Например, по HTTPS-адресу размещаем такую страницу:

      При переходе на такую страницу с HTTP сайта нас перекинет на http://google.com, при этом Firefox и IE реферер сбросят. Я это даже проверил. Для других браузеров можно применить технику с тегом <A>, у которого выставлен атрибут rel="noreferrer", как описано в статье. Думаю, тоже должно сработать.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *