1

我是 PHP 新手,希望有人可以帮助我。

我试图在我所有页面中包含的头文件中涵盖以下场景:

  1. 如果会话变量“ status”未设置并且页面名称不是“ login”或“ user”,则重定向到登录页面。
  2. 如果会话变量“ status”未设置且页面名称为“ user”且变量“ resetToken”未设置则重定向到登录页面。

到目前为止,当我从浏览器访问它们时,我有以下适用于所有页面的内容,但是当我使用来自如下电子邮件的链接时,即使链接包含变量“ resetToken”,我仍然会被重定向:

示例链接:https ://www.myurl.com/user.php?resetToken=abcde

我的 PHP(在标题中包含):

$baseURL = "https://www.myurl.com";
$pageURL = basename($_SERVER["REQUEST_URI"]);
$pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME);

if( (!isset($_SESSION["status"])) && ($pageName != "login") && ($pageName != "user") ){
    header("Location: " . $baseURL . "/login.php");
    exit;
}
if( (!isset($_SESSION["status"])) && ($pageName == "user") && (!isset($_GET["resetToken"])) ){
    header("Location: " . $baseURL . "/login.php");
    exit;
}

我对此有两个问题:

  1. 通过电子邮件链接访问页面时 $_GET 不起作用还是我必须在此处更改其他内容?
  2. 有没有办法将这些检查组合在一个 IF 语句中,而不是连续两个?

非常感谢您的帮助,迈克

4

2 回答 2

1
$baseURL = "https://www.myurl.com";
$pageURL = basename($_SERVER["REQUEST_URI"]);
$pageName = pathinfo(parse_url($pageURL, PHP_URL_PATH), PATHINFO_FILENAME);

if( (!isset($_SESSION["status"])) && 
    ($pageName != "login") && 
    ($pageName != "user")   
     ||  
    (!isset($_SESSION["status"])) && 
    ($pageName == "user") && 
    (!isset($_GET["resetToken"]))
    )
    {
       header("Location: " . $baseURL . "/login.php");
       exit;
    }

您有 2 个if条件,并且您正在重定向到同一页面...您可以将它们组合成 1 个if条件。

于 2015-07-11T12:54:00.763 回答
1
  1. $_GET无论在哪里点击 url 都有效
  2. 将这两个语句组合起来很容易,只需将它们包装起来()并将它们组合起来||

PHP

if( 
    (
        (!isset($_SESSION["status"])) && ($pageName != "login") && 
        ($pageName != "user")
    ) || (
        (!isset($_SESSION["status"])) && ($pageName == "user") && 
        (!isset($_GET["resetToken"])) 
    )   
){
    header("Location: " . $baseURL . "/login.php");
    exit;
}

当它重定向时,即使您已经设置了令牌,您也应该在之前转储变量。设置令牌时,不应重定向代码。

于 2015-07-11T12:54:32.463 回答