检查重定向源
Posted
技术标签:
【中文标题】检查重定向源【英文标题】:Check redirect source 【发布时间】:2016-01-30 18:10:00 【问题描述】:我有一个表单来编辑条目,在用户按下提交按钮后,它执行includes/edit.php?id=XXX
脚本,然后使用header('Location: ../index.php');
重定向到显示所有条目的索引页面。
在索引页面,我要创建一个条件:
如果通过edit.php?id=XXX
页面的重定向访问索引页面,则显示成功消息以通知用户编辑已成功。
这种情况应该是什么样子?
<?php
require_once('includes/session.php');
require_once('includes/config.php');
if(!isset($_SESSION['login'])) //if login in session is not set
header("Location: http://www.domain.com/app/login.php");
$query = ("SELECT * FROM archive ORDER by id DESC");
$result = mysqli_query($link, $query) or die (mysqli_error());
/*if (condition)
//show success message
*/
?>
【问题讨论】:
重要提示:在header(...)
之后添加exit()
或die()
,否则重定向会出现问题。
感谢您的提示,虽然我还没有遇到任何重定向问题,但我在header('Location: ....')
之后添加了exit()
。
$_SERVER['HTTP_REFERER'];
不可靠,您需要阅读 ***.com/a/6023980 的相关信息。我会为此使用strpos()
或stripos()
。
【参考方案1】:
你应该看看这个变量:
$_SERVER['HTTP_REFERER'];
因为它将返回您在此之前的页面:
所以你可以这样做:
if($_SERVER['HTTP_REFERER'] == "edit.php?id=XXX")
// your code here
【讨论】:
$_SERVER['HTTP_REFERER'];
不可靠,您需要阅读 ***.com/a/6023980 的相关信息。【参考方案2】:
你可以试试这个:
if(isset($_GET['id']) && !empty($_GET['id']))
// your success message
【讨论】:
虽然我发现您的答案非常有用(甚至可能适用于我的情况),但我想了解$_SERVER['HTTP_REFERER'];
,我不得不接受另一个答案,但我赞成您的答案,因为它是一个很棒的解决方案.谢谢!【参考方案3】:
如果您设置了带有消息的 $_SESSION 变量,则可以显示所有消息并随后清除列表。
添加消息:
if ( ! isset($_SESSION['messages']) )
# initialize messages
$_SESSION['messages'] = [];
# Add a new message:
$_SESSION['messages'][] = 'Something was a success!';
阅读消息:
# If there are messages not displayed
if ( isset($_SESSION['messages']) && is_array($_SESSION['messages']) )
foreach ( $_SESSION['messages'] as $message )
echo $message . '<br>';
# Clear messages
unset( $_SESSION['messages'] );
建议的“HTTP_REFERER”可以被操纵,并且不需要浏览器发送它。
【讨论】:
谢谢,这是我使用的解决方案。【参考方案4】:我建议在设置位置标头后立即重定向而不执行更多代码:
if(!isset($_SESSION['login'])) //if login in session is not set
header("Location: http://www.domain.com/app/login.php");
exit();
如果 $_SESSION['login'] 未设置:重定向并退出。
您可以将其余代码视为一个大“else”(= 如果 $_SESSION['login'] 已设置)。
回答 cmets 的问题:如果没有退出,下面的代码将被执行.. 并且执行该查询并不是真正必要的。这就是为什么最好通过添加exit
来结束程序流。参考:Why I have to call 'exit' after redirection through header('Location..') in PHP?
对于这种情况,您可以使用$_SERVER['HTTP_REFERER']
或$_GET['id']
来检查您来自的页面。只需比较字符串或其中的部分即可。
【讨论】:
谢谢你的提示,但我想问你一些事情,不使用 exit();行,在上面的条件返回 true 之后,它不会去执行里面的代码继续重定向,忽略 if 结束括号下面的代码吗? 我已在上面添加了您问题的答案。以上是关于检查重定向源的主要内容,如果未能解决你的问题,请参考以下文章