检查重定向源

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 结束括号下面的代码吗? 我已在上面添加了您问题的答案。

以上是关于检查重定向源的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是登录并相应重定向

中间件,检查 Laravel 5 后如何重定向

java web 的重定向问题

Laravel sanctum 检查用户是不是在没有重定向的情况下通过身份验证

sh 通过命令行检查重定向

检查 HTML 文件是直接访问还是被重定向