HTTP_REFERER инициировал HTML, видимый по всему сайту, а не только на начальной целевой странице - PullRequest
0 голосов
/ 04 октября 2011

Я всегда искал решение своей проблемы - я не новичок в PHP, но не слишком опытен в этом.

Моя проблема заключается в следующем:

У меня есть набор сайтов, один из которых является родительским. Я хочу, чтобы при нажатии на любой из моих дочерних сайтов только с родительского сайта появлялась кнопка «Вернуться к родителю» (обернутая в div). Если я нажму любой из дочерних сайтов напрямую или от другого реферера, кнопка не появится.

У меня это работает с использованием HTTP_REFERER, но я бы хотел, чтобы кнопка оставалась видимой при переходе по сайту (очевидно, реферер меняется, когда я начинаю переходить по сайту).

Это работает для кнопки, появляющейся при первом попадании на сайт:

<?php if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER'])) {  ?>
<div><a href="http://www.mysite.com/">Back</a></div>
<?php }  ?>

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

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

Любая помощь будет высоко ценится.

Спасибо

Ответы [ 4 ]

1 голос
/ 04 октября 2011

Как только я увидел твой вопрос, я подумал, что СЕССИЯ будет ключом.

Вы можете установить файл cookie сеанса, а затем проверить, существует ли файл cookie.

session_start();

if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER']) || 
isset($_SESSION['show_back_button']))
{

    // Set the session value
    $_SESSION['show_back_button'] = true;

    echo '<div><a href="http://www.mysite.com/">Back</a></div>';
}
1 голос
/ 04 октября 2011
<?php

session_start();

if (!isset($_SESSION["ref"])){
    $_SESSION["ref"] = $_SERVER["HTTP_REFERER"]; //record first instance
} else if (isset($_SERVER["HTTP_REFERER"])){
    $ref = $_SERVER["HTTP_REFERER"];
    if ($ref != $_SESSION["ref"]){
        $_SESSION["ref"] = $ref; // record new ref
    }
}

if ($ref = $_SESSION["ref"]){
    echo "<a href=\"$ref\">Back</a>
}

НО я согласен с Pekka, что вы должны использовать собственный site_id, который передается во время навигации по сайту. Ретрансляция на HTTP_REFERER обычно небезопасна. А использование сессии приведет к возникновению проблем, если вы зайдете на главный сайт с двух дочерних сайтов, так как сессия будет содержать только последнюю ссылку.


В другом нашем решении мы используем параметр get "current_ref", который содержит закодированный URL-адрес реферера, созданный исходным сайтом. Этот параметр «липкий» и передается по пути, поэтому в любой момент вы можете вернуться на исходный сайт. Возможно, вам лучше было бы реализовать и такой подход.

1 голос
/ 04 октября 2011

Что ж, HTTP_REFERRER действительно является последним реферером текущей страницы, поэтому вы должны сохранить и запустить сеанс при первом входе на сайт.

Сессии, как правило, очень простой предмет, который должен работать из коробки:

session_start();
session_regenerate_id();
if (preg_match("~^http://www.mysite.com~i", $_SERVER['HTTP_REFERER'])) {
$_SESSION['parentsite'] = true;
}

А позже в вашем коде сделайте:

<?php if(isset($_SESSION['parentsite']) && $_SESSION['parentsite'] == true){ ?>
<div><a href="http://www.mysite.com/">Back</a></div>
<?php } ?>

Теперь, если ваши сеансы все еще не работают с этим, это может быть проблема COOKIE или проблема конфигурации сервера ...

1 голос
/ 04 октября 2011

Редактировать: При ближайшем рассмотрении, подход на основе сеанса может быть достаточно для этой конкретной ситуации, если есть только один родительский сайт и несколько детей, но нет нескольких родителей!Однако в более сложной ситуации сеансы отправят вас в ад, поэтому я оставлю этот ответ на месте.

Это не тривиально -

  • Вы можете использовать сеансы для сохранения цели реферала на разных страницах, но это может привести к путанице, если пользователь откроет несколько экземпляров одной и той же страницы от разных рефералов, что ужасно для удобства использования

  • или отправкауникальный ключ вместе с каждым запросом, который указывает на правильную «обратную» цель.(Это также может быть URL-адрес в кодировке base64 или URL, но это может сделать URL-адреса длинными и уродливыми ...)

Последний подход очень чистый, но трудныйдля последовательной реализации.

Еще одна (безумная и непроверенная) идея, которая приходит на ум, заключается в сохранении закодированного в base64 представления URL-адреса ссылающегося элемента с использованием JavaScript в свойстве window.name.Приятно то, что в отличие от cookie, он сохраняет «заднюю» цель только для текущего окна. Я не могу гарантировать, что это будет работать, но, возможно, стоит продолжить, если вы действительнохочу сделать это.

...