有没有办法只通过使用PHP(没有AJAX)点击后退按钮来更改用户返回的网页?
为了说明,让我们假设这种情况:我有一个用PHP编程的网站,主页和“联系我们”页面。 “联系我们”页面的PHP脚本生成联系表单并显示它,并通过将表单提交给自身来处理它。申请流程如下:
第1步:主页(用户点击“与我们联系”)
第2步:联系表单页面(用户填写表单并点击提交)
步骤3:联系表单页面(脚本处理用户输入并显示成功消息)。
我想要做的是将已经到达步骤3的用户直接返回到步骤1,如果它触及浏览器中的后退按钮(即避免再次显示联系表单),但仅使用PHP,不使用AJAX或Javascript无论如何。这可能吗?
答案 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步进行重定向