【问题标题】: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']; 不可靠,您需要阅读 stackoverflow.com/a/6023980 的相关信息。我会为此使用strpos()stripos()

标签: php


【解决方案1】:

你应该看看这个变量:

$_SERVER['HTTP_REFERER'];

因为它将返回您在此之前的页面:

所以你可以这样做:

if($_SERVER['HTTP_REFERER'] ==  "edit.php?id=XXX"){
 // your code here
}

【讨论】:

【解决方案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 结束括号下面的代码吗?
  • 我已在上面添加了您问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2011-03-01
  • 2014-07-26
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多