【问题标题】:Error: localhost redirected you too many times. ERR_TOO_MANY_REDIRECTS错误:localhost 将您重定向了太多次。 ERR_TOO_MANY_REDIRECTS
【发布时间】:2020-08-22 21:19:28
【问题描述】:

我将我的框架设置为 MVC 类型,其中核心库重定向 url。这很有用,如果链接是:Some_class/some_method,它将从 Some_class 加载 some_method。此外,我还使用 .htaccess 文件将所有内容配置为通过 index.php
index.php

中的代码
<?php
session_start();
require_once 'config.php';
if (!isset($_SESSION['username']) && empty($_GET['url'])) { ?>
    <a href="Users/login">Login</a><br>
    <a href="Users/register">Register</a>
<?php } ?>

config.php中的代码

// Redirect to the homepage if not signed in
    if(!isset($_SESSION['user'])){
     header('location: http://localhost/index.php');
 }

用户控制器中的代码

public function login(){
    // Code to verify the entered credentials
    // If entered data is valid
    $_session['user'] = $_POST['user'];
}
public function log_out(){
    session_unset();
}

如果有人从 users 控制器使用 log_out 方法注销,则该方法会执行。如果代码是正确的,它应该重定向到 index.php,因为 config.php 中的代码说如果没有设置$_SESSION['user'],它应该重定向到index.php。但是,每当有人注销时,我都会收到标题中提到的错误。我做错了什么?

【问题讨论】:

  • config.php 检查会话变量,但您还没有调用session_start,所以它永远不会被设置。重定向后也可能是exit
  • 您尝试过什么调试问题?为什么不在重定向发生之前直接启动 XDebug 并设置断点?

标签: php http-redirect


【解决方案1】:

发生这种情况是因为您有一个重定向循环。这就是正在发生的事情。

  1. 用户注销且会话未设置
  2. 然后用户被重定向到 index.php,您在其中调用“config.php”
  3. 在 config.php 中,您检查用户是否未登录。他没有,所以它告诉它重定向到 index.php(然后您又回到第 2 点,然后转来转去)

如果用户已登录,则更改您的 config.php 以重定向,例如

// Redirect to the dashboard signed in
if(isset($_SESSION['user'])){
 header('location: http://localhost/dashboard.php');
}

【讨论】:

  • 问题实际上是我不希望任何人在不使用 url 登录的情况下转到任何页面(让我们采取 dashboard.php 。我可以做的其他事情是在 dashboard.php,我可以写 if (logged in?){execute code in dashboard.php} 。但是有很多页面,我不想为每个页面都这样做。所以我想要一个适用于任何页面的 if 语句。
【解决方案2】:

您的 config.php 中没有会话...所以就这样做吧..

<?php
session_start();
require_once 'config.php';

所以你的会话也将在 config.php 中。或者拿 session_start() 行到 config.php,这样会更好。

【讨论】:

  • @tanadin 没有帮助。顺便谢谢你。
  • 好吧,每个人都说一样;)
  • 老实说我试过了。事实上,我的原始代码具有相同的代码,我就是在这里这样输入的。
  • 我的意思是,这意味着您还有其他问题或无法很好调试的东西。
【解决方案3】:

您已创建无需用户登录即可使用的 url 白名单。例如,$whitelist = ['Users/login', 'Users/register', '/']; 并在重定向条件下检查当前 url

if(!isset($_SESSION['user']) && !in_array($current_url, $whitelist)){
     header('location: http://localhost/index.php');
}

还有 session_start() 来自其他答案的问题。

【讨论】:

    【解决方案4】:

    您在 config.php 加载后开始您的会话。否则 if 语句下的条件将始终为真,它将作为无限循环工作。首先启动会话,然后加载 config.php 文件。如果您的 index.php 文件适用于未登录的人,则在加载 index.php 时不要包含 if 块来检查用户是否已登录。因为对于将创建相同无限循环的来宾用户。该部分应仅添加到已登录用户的页面中。

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多