$_SERVER['HTTP_REFERER'] не работает

Тема в разделе "Как сделать...", создана пользователем zek24, 21 май 2014.

  1. zek24

    zek24

    Moderator
    Регистр.:
    14 ноя 2009
    Сообщения:
    778
    Симпатии:
    233
    Привет,
    столкнулся с непонятной ситуацией в простейшем коде:
    после нажатия на ссылку попадаем
    PHP:
    <a href="success.php" id="test">Link</a>
    <?php
    if(isset($_SERVER['HTTP_REFERER'])) {
      echo 
    $_SERVER['HTTP_REFERER'];
    }
    ?>
    на success.php, а через сек. возвращаемя на стартовую
    PHP:
    header("Refresh: 1; URL={$_SERVER['HTTP_REFERER']}");
    echo 
    "success";
    Но на стартовой нет отображения значения $_SERVER['HTTP_REFERER']
    Почему?
     
    Последнее редактирование: 21 май 2014
  2. Darkness

    Darkness Постоялец

    Регистр.:
    21 янв 2013
    Сообщения:
    146
    Симпатии:
    69
    Это от браузера зависит, многие браузеры не отправляют данный заголовок при использовании header( 'Location: /'); или header( 'Refresh: 0; url=/' );, вообще по стандарту данный заголовок отправляется только при переходе по ссылке пользователем.
     
  3. Vishez

    Vishez

    Регистр.:
    19 авг 2013
    Сообщения:
    170
    Симпатии:
    81
    Видимо потому что заголовок Referer не установлен. Хотя даже если его установить вот так в пхп
    Код:
    header("Referer: http://test.ru");
    - все равно echo не выведет его. Хотя в файербаге видно.
    думаю вот так будет работать(будет виден реферер)
    Код:
    <script>
    window.location.replace(<?php echo chr(39).$_SERVER['HTTP_REFERER'].chr(39); ?>);
    </script>
    
     
  4. Darkness

    Darkness Постоялец

    Регистр.:
    21 янв 2013
    Сообщения:
    146
    Симпатии:
    69
    Заголовки от сервера и заголовки от браузера это разные вещи.
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.517
    Симпатии:
    1.368
    isset это хорошо, но он не означает, что в переменной что-то есть. Код ниже вернёт true:
    PHP:
    $_SERVER['HTTP_REFERER'] = '';
    var_dump(   isset($_SERVER['HTTP_REFERER']));

    $_SERVER['HTTP_REFERER'] = false# и даже так :)
    var_dump(   isset($_SERVER['HTTP_REFERER']));
    По хорошему REFERER это не менее 7 символов на протокол (Перейти по ссылке) и еще хотя бы 4 символа на домен (i.ua) в итоге мы проверку делаем:
    PHP:
    if(isset($_SERVER['HTTP_REFERER']) && strlen($_SERVER['HTTP_REFERER']) > 10) { //либо mb_strlen