Есть ли способ изменить веб-страницу, на которую пользователь возвращается, нажав кнопку «назад» только с помощью PHP (без AJAX)?

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

Шаг 1: Домашняя страница (пользователь нажимает «связаться с нами»)

Шаг 2: Страница контактной формы (пользователь заполняет форму и нажимает кнопку "Отправить")

Шаг 3: Страница контактной формы (скрипт обрабатывает ввод пользователя и отображает сообщение об успехе).

Я хотел бы направить пользователя, который достиг шага 3, к шагу 1, если он нажимает кнопку «Назад» в браузере (то есть не показывать снова контактную форму), но только с использованием PHP, без AJAX или Javascript. Это возможно?

php
1
user3783407 2 Сен 2017 в 20:55

4 ответа

Лучший ответ

Ответ да, и нет

Если кто-то читает ваш вопрос очень точно, вы фактически задаете два разных вопроса:

Изменить содержание ранее отображаемой страницы при нажатии кнопки назад

Ответ: Джепп! На самом деле это не имеет большого значения.

Есть ли способ изменить веб-страницу, на которую пользователь возвращается, нажав кнопку «назад» только с помощью PHP (без AJAX)?

Ответ: Нет! Это всегда будет страница, предшествующая текущей в стеке журнала истории браузеров. Но, как уже упоминалось выше, вы можете абсолютно изменить содержание этой страницы. в теме на предыдущую страницу.

Пример: Допустим, кто-то находится на сайте "home.php", переходит на "contact.php" и затем нажимает кнопку "Назад". Он обязательно вернется на сайт "home.php" (по крайней мере, только с PHP). Но PHP-скрипт на «home.php» может знать, какой была предыдущая страница, и предоставлять совершенно другой вид. Независимо от того, что URL в адресной строке браузера останется как «home.php», вам решать, какой контент будет отображаться.

Чтобы обойти это, вы могли бы только перенаправить, чтобы фактически изменить местоположение.


Давайте начнем с основ

Если вы хотите принимать решения на основе предыдущей страницы, вам определенно необходимо знать, какую предыдущую страницу посетил пользователь - верно?
Конечно, не существует только одного решения, но для описанной вами установки я рекомендую использовать PHP сессия. На самом деле вам нужны только session_start () функция и $ _ SESSION superglobal, а также header () function, если вы хотите перенаправить свою аудиторию.

Может быть, вы хотите взглянуть на макет, который я сделал для начальной загрузки сценария.

Это всего лишь один файл, который ведет себя именно так, как вы просите («направить пользователя, достигшего шага 3, к шагу 1, если он нажмет кнопку« Назад »в браузере»). Он должен работать "из коробки" как есть , поэтому не стесняйтесь тестировать его на сервере.

<?php

session_start();

// get and sanitize page id
$view = key( $_GET );
if ( !$view || 'home' != $view && 'contact_us' != $view && 'thank_you' != $view ) {
    $view = 'home';
}

// get last page id and set current page as the new last page
$last_view = $_SESSION['last_view'];
$_SESSION['last_view'] = $view;

// VALIDATE VIEW
// redirect or manipulate the assumed page under specific circumstances
if ( 'thank_you' == $last_view ||
     'thank_you' == $view && 'contact_us' != $last_view ) {
    // redirect version
    header('Location: /?home');
    /* change assumed page version (just uncomment the line below
     * and delete the one above to see the different behavior)
     * the delivered content will be the same in this case but the adress bar
     * will not change accordingly
     */
    //$view = 'home';
}

?><!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title><?php echo $view; ?></title>
</head>
<body>

<nav>
    <?php echo 'home' == $view
        ? '<a href="/?contact_us">Contact Us</a>'
        : '<a href="/?home">Home</a>'; ?>
</nav>

<h1>last page was "<?php echo $last_view; ?>"
    and current one is "<?php echo $view; ?>"</h1>

<?php if ( 'home' == $view ) : ?>
    <!-- content home or content when last page was thank you -->
    <h2>Welcome Home</h2>

<?php elseif ( 'contact_us' == $view ) : ?>
    <!-- content contact_us -->
    <h2>Contact Us</h2>
    <form action="?thank_you" method="POST">
        <input name="name" value="" placeholder="Whats your name?" required>
        <input type="submit">
    </form>

<?php else : ?>
    <!-- content thank_you -->
    <h2>Thank You So Much "<?php echo $_POST['name']; ?>"</h2>

<?php endif;

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

<?php
session_start();

// get your page id by filename in conjuction with $_POST data
// if your form at site "contact_us.php" uses `method="get"` just change "$_POST" to "$_GET"
$view = $_POST ? 'thank_you' : pathinfo( $_SERVER['PHP_SELF'], PATHINFO_FILENAME );

$last_view = $_SESSION['last_view'];
$_SESSION['last_view'] = $view;

if ( 'thank_you' == $last_view ||
     'thank_you' == $view && 'contact_us' != $last_view ) {
    header('Location: /'); // will redirect to the root of your domain
    //$view = 'home';
}
?><!DOCTYPE html>

Так что теперь все хорошо?

Нет - совсем нет ИМХО!

На странице гораздо больше, чем просто нажать кнопку «Назад». Как насчет кнопки перезагрузки, например. Или как насчет очень быстрого нажатия кнопки «Назад» или разных комбинаций сказанного. Если вы попытаетесь рассмотреть все или даже множество возможных обстоятельств, у вас наверняка начнутся сильные головные боли! Это просто очень забавно - вы знаете:]

Еще раз: вы можете продолжить работу с моим сценарием в качестве отправной точки, и, если он действительно просто нажмет кнопку "Назад", он сделает это за вас.


Но как насчет гораздо лучшего решения ???

Рекомендация

Сделайте это на одной странице и сделайте это с AJAX. Не в целом, а в сценарии, который вы описали!

На самом деле это было бы проще и понятнее!


Если вы действительно хотите остаться с PHP только тогда, возможно,

Лучший подход

Когда пользователь отправил форму, можно поймать текущую временную метку, добавить дополнительное время (фаза, в которой «свяжитесь с нами» перенаправит на домашнюю страницу) и развернуть эту временную метку как переменную $ _SESSION.

<?php
session_start();

// redirect to home page if in restricted period and not on home page
if ( $_SESSION['restricted_period'] &&
     $_SESSION['restricted_period'] > $_SERVER['REQUEST_TIME'] ) {
    if ( 'contact_us.php' == pathinfo( $_SERVER['PHP_SELF'], PATHINFO_BASENAME ) ) {
    // if ( 'contact_us' == key( $_GET ) ) { // that would be suitable for the mockup above
        header('Location: /'); // will redirect to the root of your domain
    }
} else {
    $_SESSION['restricted_period'] = null;
}

// if your form at site "contact_us.php" uses `method="get"` just change "$_POST" to "$_GET"
if ( $_POST ) { // the "thank you" part
    // means the visitor will not be able to visit "contact us" for 45 seconds from now on
    $_SESSION['restricted_period'] = strtotime('+45 seconds'); // short for testing
    // change to '+10 minutes', '+1 hour', whatever you like
}
2
Axel 8 Окт 2017 в 12:52

Невозможно управлять событиями браузера, такими как кнопка назад или вперед в PHP, потому что PHP обрабатывается на стороне сервера, а не на стороне клиента. Так что вы не можете сделать это в PHP. Но вы можете использовать HISTORY APIs в JavaScript, чтобы перенаправить пользователя на шаг 1. Вы можете получить больше помощи здесь Сценарий перенаправления кнопки «Назад»

PS: изменение поведения браузера, как правило, нет, нет.

Надеюсь, это поможет.

1
Vijay Rathore 2 Сен 2017 в 18:13

Я думаю, вы можете использовать директиву header () в вашем PHP-файле. К сожалению, это не будет работать с кнопкой браузера. Этот код будет выглядеть так:

Ваша форма при отправке прямо в файл script.php.

<form action="script.php" method="post">
     //form controls
</form>

Файл script.php.

<?php
   //Do your stuff with data from user
   header("Location: index.php"); //this send to first page
?>

Кроме того, вы можете отправить на первую страницу некоторые параметры GET, чтобы изменить содержимое или сделать что-то еще, например:

<?php
   //Do your stuff with data from user
   header("Location: index.php?action=dosomething");
?>

Вы должны помнить, что заголовок должен быть первыми данными, которые выводятся из файла script.php.

Я надеюсь, что мой ответ помог.

Ура

2
Mateusz H. 2 Сен 2017 в 18:31

Вы не можете, но вы можете использовать хитрость, вы можете создать сеансовую переменную на шаге 3, а затем, когда пользователь использует обратную кнопку да или да, перейдут к шагу 2, но вы можете создать условие, если сеанс вар существует, перейдите к шагу 1. редирект

1
Gamboa YGB 2 Сен 2017 в 18:30