Допустим, у меня есть две страницы page1.php
а также page2.php
и я хочу page2.php
отображаться только в том случае, если это перенаправленная форма page1.php
и я вставил этот код page2.php
if($_SERVER['HTTP_REFERER'] == "page1.php")
{
//keep displaying page2.php
}else{
//if it is not redirected from page1.php
header('Location:page1.php')
//redirect the user back to page1.php
}
этот код работал нормально, пока у меня нет формы и кнопки отправки page2.php
при нажатии кнопки отправки страница обновляется, что означает HTTP_REFERER
изменится на page2.php
Так что мой if statement
не удается, и это возвращает меня к page1.php
Я не хочу, чтобы это случилось. Есть ли способ предотвратить это?
Заранее спасибо.
Я бы не рекомендовал использовать HTTP_REFERER:
Это довольно просто манипулировать в браузере.
Некоторые пользователи могут иметь настройки безопасности в своем браузере, чтобы вообще не отправлять этот заголовок.
Это не доступно через HTTPS.
Некоторые прокси удаляют этот заголовок из запроса
добавлено — см. ответ на этот вопрос
Как Шарлотта Дюнуа заявила в комментарии, лучше установить значение сеанса перед отправкой формы, а затем проверить его на странице 2.
page1.php:
$_SESSION[ 'display_page2' ] = TRUE;
//rest of the content
page2.php:
if ( (isset( $_SESSION[ 'display_page2' ] ) && $_SESSION[ 'display_page2' ] === TRUE ) || isset( $_POST[ 'some_form_input' ] ) ) {
//keep displaying page2.php
} else {
header('Location:page1.php');
exit;
}
С isset( $_POST[ 'some_form_input' ] )
, вы можете проверить, была ли отправлена форма (через метод POST).
При необходимости вы можете отменить сеанс с unset( $_SESSION[ 'display_page2' ] );
или установив его на другое значение.
<?php
if(($_SERVER['HTTP_REFERER'] == "page1.php") || (isset($_POST['submit']) && $_SERVER['HTTP_REFERER']=="page2.php"))
{
//keep displaying page2.php
}else{
//if it is not redirected from page1.php
header('Location:page1.php');
//redirect the user back to page1.php
}
?>
если реферер не страница 1, вы можете проверить условие, если реферер = страница2 и сообщение отправлено.
или проверьте, является ли реферал page1 или отправлено сообщение.
Это возможность избежать вашей проблемы.
Я советую не использовать $_SERVER['HTTP_REFERER']
как это может быть легко подделано.
Вместо этого вы можете установить печенье когда они загружают страницу 1, используя setcookie("page1", 1);
до любая разметка выводится. Затем проверьте это на странице 2, используя
if(isset($_COOKIE['page1']))
{
//keep displaying page2.php
}else{
//if it is not redirected from page1.php
header('Location:page1.php')
//redirect the user back to page1.php
}
Не указав дату истечения срока действия, cookie истекает при закрытии браузера. В этой ситуации использование файлов cookie также делает код более читабельным для других.
<?php
/*
this page allows links from the following pages
public.php?id=links
private.php?id=links
don't allow if visitors come from anywhere else
this example would only work if I used the entire URL in the 'if' statement
*/
$referringpage = $_SERVER['HTTP_REFERER'];
if ( $referringpage == "http://www.example.com/public.php?id=links" ) {
$pass = "yes";
} elseif ( $referringpage == "http://www.example.com/private.php?id=links" ) {
$pass = "yes";
} else {
$pass = "no";
}if ( $pass == "yes" ) {
// do the function this page was made to do
}
header( "Location: http://www.example.com/public.php?id=links" );
?>