2009-07-27 4 views
1

Мне нужно определить, куда только что щелкнул пользователь, поскольку содержимое AJAX должно отображаться по-разному в зависимости от исходной страницы, в которую она будет вставлена.PHP HTTP_REFERRER - как определить последнюю страницу?

Если нужно зайти в about.php, это должны быть только данные, но если нужно перейти в about-main.php, то это должен быть весь средний столбец, поэтому для данных требуется обтекатель заголовка/нижнего колонтитула.

html, вызываемый через AJAX, хранится на php-странице, которая использует этот код, чтобы узнать, кто спрашивает, а затем соответствующим образом форматирует ответ HTML.

$array[] = "/cf/about.php"; 
$array[] = "/cf/about/about-main.php"; 
$array[] = "/cf/about/other-page.php"; 


$ispage = ""; 
foreach ($array as $value) { 
    if ($_SERVER['HTTP_REFERER'] != $value) { 
     $ispage = ""; 
    } else { 
     $ispage = "woot"; 
    } 
} 
if ($ispage == "woot") { 
     echo $content; 
    } else { 
     include_once 'about-header.php'; 
     echo $content; 
     include_once 'about-footer.php'; 
} 

Проблема в том, что ... HTTP_REFERER, похоже, немного поражен и промахнулся. Он работает отлично, пока я работаю в сети, но я пробовал его на своем компьютере дома и, очевидно, полностью не работает - результаты ужасны: o

Есть ли другой способ достижения это? Я предполагаю, что переменные сеанса можно использовать, но тогда у меня не так много опыта!

Все советы и подсказки приветствуются;) Спасибо!

редактировать:

страница фактически страница профиля персонала. Его нормальное расположение - about.php, а второй столбец div отображает сетку эскизов, которые при нажатии на них загружают профиль в этом месте через AJAX. Все кнопки nice и simple - back перезагружают сетку фотографий.

Проблема в том, что каждому сотруднику также нужна статическая страница. Я создал их по адресу/staff-name.php. Однако контент является ТО ЖЕ. Я хочу, чтобы сервер обнаружил, что кто-то пришел к about/staff-name.php напрямую, и если да, оберните вокруг него верхний/нижний колонтитул.

Если запрос поступит из сетки фотографий (например, AJAX), то он не нуждается в оболочке заголовка/нижнего колонтитула.

Это ясно? : О

1) Если AJAX запрос - не обертка 2) Если не AJAX запроса - добавить заголовок/колонтитул обертка

ответ

3

Не было бы проще просто передать флаг в вызове AJAX, чтобы сообщить скрипту какой тип содержимого отображать?

Edit:

Так о/штабс-name.php отображает содержимое. Назовите его через AJAX как about/staff-name.php? FromAjax = 1

Затем в о/штат-имя.PHP файл:

if (isset($_REQUEST['FromAjax'])) { 
    echo $content; 
} else { 
    include_once 'about-header.php'; 
    echo $content; 
    include_once 'about-footer.php'; 
} 
+0

Нет, не думаю, что так - см. Выше, отредактирует главный пост :) – MrFidge

+0

Так просто ... спасибо большое: D – MrFidge

3

Независимо от того, на что, Referer не является информация, которую вы должны основывать весь свой сайт на: оно посылается клиентом, что означает (по крайней мере):

  • клиента не обязательно, чтобы отправить его
    • его можно отключить в браузере
    • некоторые брандмауэр/антивирус удалить его
  • может быть подделана/изменен (простой способ с светлячок, чтобы использовать расширение, чтобы сделать это)

Вы должны определенно найти лучший/Саффер/более надежный способ сделать то, что вам нужно.

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

Возможно, проще было бы добавить параметр к вашему запросу Ajax, указав, откуда он взялся? т.е. вместо того, чтобы полагаться на Referer в PHP-скрипте, просто посмотрите на параметр в запросе, который будет действовать как «референт», но поставленный вами?

Это не будет более безопасным (пользователи могут по-прежнему подделать запрос, с этим параметром), но, по крайней мере, он не был бы отключен/модифицирована (за исключением, если пользователь делает это вручную)


В конце концов, вы также сказать:

1) Если AJAX запрос - не обертка
2) Если не запрос AJAX - добавить заголовок/Ф.О. OTER обертки

Ну, если это только вопрос определения, если PHP скрипт был вызван через запрос Ajax, здесь тоже два решения:

  • Добавить параметр в запрос, когда это сделано через Ajax (вы добавляете этот параметр только в скрипт JS, выполняющий запрос; и когда параметр здесь, PHP знает, что это запрос Ajax)
  • Или, в PHP-скрипте, найдите HTTP-заголовок X-Requested-With, который часто здесь со значением XMLHttpRequest, когда запрос выполняется через вызов Ajax. (Но вы должны убедиться, что он установлен с помощью JS Framework/или может быть, это зависит от браузера - не уверен, что :-()
+0

Да, я думаю, что решение Vex было превосходным, я не понял, что это было просто ! Спасибо за вашу помощь :) – MrFidge

+0

добро пожаловать :-) получайте удовольствие! –

1

Почему вы не просто создавать статические страницы на панели сервер без использования ajax вообще, включая верхний и нижний колонтитулы и бит профиля? Если страница статична, вам не нужно будет загружать контент с помощью javascript.

Если вам нужно загрузить его с помощью javascript, тогда Решение Vex - это хорошо.Вы можете передать некоторые необязательные параметры в вызове ajax, которые контролируют способ отображения страницы. Таким образом, включенная страница не обязательно должна знать о страницах, которые ее используют, ей просто нужно понять параметры, которые рассказывают, как визуализировать сам. В дальнейшем вы можете использовать его более легко.

Я заметил ошибку в коде, однако - это, вероятно, не будет работать, как ожидалось:

$ispage = ""; 
foreach ($array as $value) { 
    if ($_SERVER['HTTP_REFERER'] != $value) { 
     $ispage = ""; 
    } else { 
     $ispage = "woot"; 
    } 
} 

Если имя страницы совпадают, но тогда следующий один не, $ ispage будет установите значение ''. Вы, вероятно, лучше делать что-то вроде:

$ispage = ""; 
foreach ($array as $value) { 
    if ($_SERVER['HTTP_REFERER'] == $value) { 
     $ispage = "woot"; 
     break; 
    } 
} 

или

$ispage = ''; 
if (in_array($_SERVER['HTTP_REFERER'], $array)) { 
    $ispage = 'woot'; 
} 
+0

Идея заключалась в том, чтобы не переделывать статические страницы все время, если содержимое изменяется. Таким образом, я могу отображать один и тот же контент по-разному в зависимости от того, откуда пришел запрос. Cheers для редактирования кода, хотя, я понимаю, что вы имеете в виду. – MrFidge

+0

Да, я имел в виду, что для того, чтобы страница была динамичной, необязательно использовать AJAX. поэтому вы можете создавать свои «статические» страницы профиля на сервере, они являются статическими, поскольку они не меняются после начальной загрузки страницы, но они динамичны, поскольку они по-прежнему загружают ваш профиль внутри. –

0

Tai кусинг -

При форматировании ссылок, как это:

<a href="http://www.this-is-a-link.html?setvariablehere=yes">link</a> 

Тогда PHP просто должно быть таким:

if (isset($_REQUEST['setvariablehere'])) { 
    do something for when variable IS set 
} else { 
    do something for when variable IS NOT set 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^