Opencart - Редирект Без Http Referer

Тема в разделе "Общие вопросы", создана пользователем admin, 22 июл 2016.

  1. TopicStarter Overlay
    Offline

    admin Команда форума Администратор

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

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

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

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


    Разумеется, совершить редирект, отослав браузеру заголовок (с кодом 301 или 302, например) не получится, так как браузер в этом случае удержит реферер, но не обнулит его, и даже не изменит. Придется делать решение, совмещающее в себе различные подходы. Итак, сначала я приведу код, а потом - пояснения по нему.
    Код:
    <?php
    //Ваша ссылка, на которую осуществляется редирект
    $target_link = 'http://lowenet.biz';
    
    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" />
            <meta http-equiv="cache-control" content="max-age=0" />
            <meta http-equiv="cache-control" content="no-cache" />
            <meta http-equiv="expires" content="0" />
            <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
            <meta http-equiv="pragma" content="no-cache" />
            <meta http-equiv="refresh" content="$meta_timeout;url=$target_link">
            <title></title>
            <script type="text/javascript">
            <!--
            var redirect = function()
            {
                document.getElementById("link").click();
            }
            -->
            </script>
        </head>
        <body $onload>
            <a href="$target_link" rel="noreferrer" id="link"></a>
        </body>
    </html>
    HERE;
    Много комментариев дано прямо в коде, но я поясню поподробнее. В скрипте скомбинировано два разных подхода к переадресации в зависимости от браузера:
    1. META-редирект. Хорошо работает в Firefox и IE, очищая поле Referer.
    2. Редирект через JavaScript методом программного клика по ссылке с атрибутом rel="nofollow". Это работает в последних версиях браузеров, основанных на движке WebKit (Chrome, Safari, новая Opera). На случай, если JavaScript отключен, через 3 секунды будет осуществлен META-редирект. Это не очистит поле Referer в перечисленных браузерах, но, как минимум, заменит его и в любом случае осуществит переадресацию.

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