【问题标题】:PHP header and $_SESSIONPHP 标头和 $_SESSION
【发布时间】:2011-03-18 11:29:35
【问题描述】:

我目前正在构建一个 CMS,但我遇到了 PHP 会话问题:

  • 我网站上的任何地方用户都可以通过向 URL 添加查询字符串来启动 CMS -> ?mod=admin
  • ?mod=admin 将重定向到 login.php
  • 身份验证后,我想将用户重定向到他来自启用 CMS 功能的页面

为此,我在用户访问 login.php 之前将当前页面 url 存储在会话中

url.class.php 脚本

function curPageURL() {
 session_start();
 $pageURL = 'http';
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["PHP_SELF"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["PHP_SELF"];
 }
 $_SESSION['url'] = $pageURL;
}

Login.php 脚本: 如果验证成功,我将启动一个会话并尝试将用户重定向到他来自的页面:

if($num_rows == 1){
  session_start();
  $_SESSION['username'];
  header('Location: ' . $_SESSION['url']);
}

我收到“会话已开始”错误。
但是,如果我重定向到特定页面(例如主页),那么一切正常。 例如 -> header('Location: index.php');

【问题讨论】:

  • 什么是行'$_SESSION['username'];'应该怎么做?
  • 如果 $_SESSION['username'] 存在,那么我知道用户已登录
  • 在这种情况下,您必须在标题周围放置 if (isset($_SESSION['username'])){ } 而不是该行。但是,如果 url 正确并且您在 header 语句之前没有输出任何 html,则重定向应该可以工作。
  • 你知道你必须在函数 curPageURL 中使用 session_start() 吗?
  • 在 if($num_rows == 1){} 之前我进行了登录验证。我检查 $_POST['username'] & $_POST['password'] = MySQL 条目)。如果它返回一行,那么我通过在页面上启动会话来记录我的用户,他们将被重定向-> session_start(); $_SESSION['用户名'];

标签: php session redirect header


【解决方案1】:

你不能只使用 $_SERVER['HTTP_REFERER'] 重定向到上一页吗?

当您尝试在当前状态下运行脚本时实际发生了什么?

【讨论】:

  • 那么你很可能在代码中的其他地方声明了 session_start() 并且这已经在此处声明之前执行了。注释掉 session_start() 看看会发生什么。同样正如其他人提到的那样,$_SESSION['username'] 需要包含在 if 语句中才能实际执行某些操作。
  • http_referer 并不总是可用的,并且可能不是用户来自的页面。它是用户提供的数据,可以包含任何内容。
  • 好调用 Marc,可以在浏览器中禁用引用标题。
  • 站点的每个页面都包含 url.class.php(保存当前页面的 url)。所以是的,一个 session_start() 已经被声明了。是否意味着通过删除“session_start();”从 login.php 函数中,会话仍然处于活动状态并且 $_SESSION['username'] 将被创建?
  • 理论上是的,只要 session_start() 在堆栈中的某处被调用,会话就会被初始化。如果有疑问,请注释掉并查看它如何影响它,这是最好的学习方式。
【解决方案2】:

如果这是您遇到的错误,那么您需要检查您是否已经在其他地方开始了会话。在这种情况下,您需要输入:

if(!isset($_SESSION)){
    session_start();
}

代替您放置常规 session_start() 的位置。

【讨论】:

  • 这实际上可能是解决方案(不幸的是我现在无法进行测试)。 url.class.php 包含在每个页面中,因此会话已经开始。
  • 很好,我以前也遇到过同样的问题。每页只能创建一次会话。我希望它对你有用。
【解决方案3】:

在 url.class.php 中,你已经开始会话了吗?您的问题可能是您尚未启动会话,因此无法存储会话数据。

在您的 url.class.php 中尝试检查会话变量是否包含您想要的值。

【讨论】:

  • 我修改了我的帖子 - 是的,我在 url.class.php 中开始了会话 - 这就是为什么我在执行时遇到错误 -> header('Location: ' . $_SESSION['url' ]);
【解决方案4】:

我网站上的任何地方用户都可以启动 CMS

我假设您的意思是该网站是通过 CMS 实现的,并且用户可以在任何阶段通过附加到查询字符串来访问提升的权限/附加功能。

在会话中存储当前页面 url

呃。

这不是存储此信息的正确位置 - 它应该通过 URL 传递(或通过 POST - 但这在重定向中不起作用):

session_start();
if (!is_auth_for_cms() && $_GET['mod']=='admin') {
     // simplified a bit...
     $comeback='http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     // rewriting the get trigger avoids short circuit looping problems
     $comeback=urlencode(str_replace('mod=admin', 'mod=auth', $comeback));
     header("Location: " 'http://' . $_SERVER['HTTP_HOST'] . "/login.php?backto=$comeback";
}

抛开代码中的拼写错误,问题是什么?

if($num_rows == 1){
  session_start();
  $_SESSION['username'];
  header('Location: ' . $_SESSION['url']);
}

你认为第三行的作用是什么?

【讨论】:

  • 道歉 - 我的问题已被错误地删除。刚刚编辑了我的原始帖子。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 2013-05-03
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多