为什么会话在网站的主目录中不起作用

Why sessions are not working in home directory of website

在我的网站上,登录后设置了会话,但它们在主目录的文件中不起作用,但它们在其他目录(如 /admin)中起作用。

可能是我的 robots.txt 文件有问题。 这是 robots.txt 文件的代码-

User-agent: *
Disallow: /cgi-bin/
Disallow: /admin/
Disallow: /*?*

我的导航栏代码-

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" href=""><?php echo website_name; ?></a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item ">
                <a class="nav-link" href="<?php echo location; ?>">Home </a>
            </li>

            <li class="nav-item ">
                <a class="nav-link" href="dashboard.php">Dashboard</a>
            </li>

            <li class="nav-item">
                <a class="nav-link " href="about-us.php" >About Us</a>
            </li>

            <li class="nav-item">
                <a class="nav-link " href="contact-feedback.php" >Contact Us / Feedback</a>
            </li>
            
            <li class="nav-item">
                <a class="nav-link " href="privacy-policy.php" >Privacy Policy</a>
            </li>
            
            <?php
            
            session_start();
            
            if (isset($_SESSION['loggined'])){
                
            echo '<li class="nav-item">
                <a class="nav-link " href="wins.php">My Wins</a>
            </li>';
            
            }
            
            ?>
            
            <?php
            
            if (isset($_SESSION['admin'])) {
                echo '
                
            <li class="nav-item">
                <a class="nav-link " href="admin/Web_ManageMent" >Admin Panel</a>
            </li>
            
                ';
            }
            
            ?>
        </ul>

        <?php
    
        if (!isset($_SESSION['loggined']) ) {
            echo '
    <div class="row">
        <button class="btn btn-sm btn-primary mx-3 my-2" data-toggle="modal" data-target="#loginModal"  id="loginBtn">Login</button>
        <button id="signupBtn" class="btn btn-sm btn-primary my-2" data-toggle="modal" data-target="#signupModal" >Sign Up
        </button>
    </div>
    ';

        } else {
            echo '
                <hr>
        <span class="text-white">Welcome , '.$_SESSION['name'].'</span>
        <br>
        <button class="btn btn-sm btn-primary mx-3 my-2"><a class="text-white" href="registration/logout.php">Log Out</a></button>
        
      
     ';
     
        }
   
        ?>
    
    </div>
</nav>


<?php

include("modals/signup.php");
include("modals/login.php");
?>

我在login.php

设置会话的地方
$_SESSION["loggined"] = true;
    $_SESSION["username"] = $username;
    $_SESSION["name"] = $row['display_name'];
    $_SESSION['id'] = $row['user_id'];
    
    
    header("location: dashboard.php");

/admin 中的导航栏 - Navigation Bar

主目录文件中的导航栏 - Navigation Bar

因此会话在主目录中不起作用

您的 robots.txt 文件与 PHP 完全无关。 纯粹是如何告诉道德机器人要索引哪些文件。

PHP 中会话“不工作”的常见问题是由于 session_start(); 未被调用。

请将以下代码添加到它们不起作用的页面顶部:

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

老实说?我输入 session_start() 已经超过 11 年了。为什么?因为,如果你在 2021 年 PHP 中赤裸裸地编写代码,那你就大错特错了。

请学习 Laravel 或任何现代框架。你、你的项目、你的同事、整个世界都会变得更好。

我每天编码 PHP,从字面上看,我从 2010 年开始就没有直接搞乱过 $_SESSION[]。这就像在 JavaScript 中做 document.getElementById('foo');。也请不要那样做 ;-)

P.S。您可能会考虑学习如何设计无状态 PHP 应用程序,依靠前端 AJAX 通过 localStorage.getItem('key') 存储状态,使用 JWT 令牌 (tymon/jwt-auth) 作为身份验证系统。

事实上,这就是过去 5 年我们一直在努力的方式。

请阅读这篇文章:

Goodbye PHP Sessions, Hello JSON Web Tokens