点击返回按钮时更改先前显示的页面的内容

时间:2017-09-02 17:55:18

标签: php

有没有办法只通过使用PHP(没有AJAX)点击后退按钮来更改用户返回的网页?

为了说明,让我们假设这种情况:我有一个用PHP编程的网站,主页和“联系我们”页面。 “联系我们”页面的PHP脚本生成联系表单并显示它,并通过将表单提交给自身来处理它。申请流程如下:

第1步:主页(用户点击“与我们联系”)

第2步:联系表单页面(用户填写表单并点击提交)

步骤3:联系表单页面(脚本处理用户输入并显示成功消息)。

我想要做的是将已经到达步骤3的用户直接返回到步骤1,如果它触及浏览器中的后退按钮(即避免再次显示联系表单),但仅使用PHP,不使用AJAX或Javascript无论如何。这可能吗?

4 个答案:

答案 0 :(得分:2)

我认为您可以在PHP文件中使用header()指令。不幸的是,这不适用于浏览器按钮。此代码如下所示:

直接提交给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文件中输出的第一个数据。

我希望我的回答有所帮助。

干杯

答案 1 :(得分:2)

答案是是,否

如果您非常准确地阅读了您的问题,那么您实际上会提出两个不同的问题:

  

按回按钮时更改先前显示页面的内容

答案:杰普!实际上这不是什么大问题。

  

有没有办法只通过使用PHP(没有AJAX)点击后退按钮来更改用户返回的网页?

答案:没有!它始终是浏览器历史记录日志堆栈中当前页面之前的页面。但如上所述,您绝对可以更改内容该页面的主题是上一页。

示例:让我们说一个人在现场&#34; home.php&#34;,导航到&#34; contact.php&#34;然后点击后退按钮。他肯定会再回到现场&#34; home.php&#34; (至少只使用PHP)。但是#34; home.php&#34;上的PHP脚本可以知道哪个是上一页并提供完全不同的视图。独立于浏览器地址栏中的URL将保持为&#34; home.php&#34;,无论将显示什么内容,都取决于您。

为了避免这种情况,您只能进行重定向以实际更改位置。

让我们从基础开始

如果您想根据上一页做出决定,您必须知道哪个是用户访问过的上一页 - 对吗? 当然,并不是只有一种解决方案,但对于您所描述的设置,我建议使用PHP session。实际上,如果您想重定向观众,则只需要session_start() function$_SESSION superglobal以及header() function

也许你想看一下我为引导场景所做的模型。

这只是一个文件,其行为与您要求的完全相同(&#34;如果用户点击浏览器中的后退按钮,则将已经到达步骤3的用户指向第1步;#34;) 。 它应该是开箱即用的 - 所以随时在服务器上测试它。

<?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;

这是一个版本,根据如何获取页面ID,应该更适合您当前的设置

<?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>

现在一切都好吗?

没有 - 根本不是恕我直言!

然后在页面上点击并按下后退按钮。例如,重新加载按钮怎么样?或者如何快速地按下后退按钮多次或者说不同的组合。如果你试着考虑每一个甚至是很多可能的情况,你可能会感到头痛,我打赌!多数人非常hacky - 你知道:]

再次:你可以继续我的脚本作为起点,如果它真的只是按下后退按钮那么它会为你做。

但是更好的解决方案呢?

建议

在一个页面中进行,并使用AJAX进行。不是一般情况,而是在你所描述的场景中!

实际上这会更简单直接!

如果你真的想继续使用PHP,那么这里可能是

更好的方法

当用户提交表单时,可以捕获当前时间戳,添加一些额外时间(&#34;联系我们&#34;将重定向到主页)并将此时间戳部署为$ _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 :(得分:1)

无法控制PHP中的后退或前进按钮等浏览器事件,因为PHP是在服务器端而不是在客户端处理的。所以你不能在PHP中做到这一点。 但您可以在JavaScript中使用HISTORY API使用户重定向到第1步。 你可以在这里获得更多帮助 Back button redirect script

PS:改变浏览器行为通常是不行的。

我希望这会有所帮助。

答案 3 :(得分:1)

你不能,但你可以使用一个技巧,你可以在步骤3创建一个会话变量然后当用户使用后面的按钮是或是将转到第2步但你可以创建一个条件是var会话存在去第1步进行重定向