【问题标题】:session not working when i force read html as php当我强制将 html 读取为 php 时会话不起作用
【发布时间】:2021-09-07 23:56:47
【问题描述】:

我在我的网站上为一个学校项目工作。网络有一个登录系统。我知道我在做的是愚蠢的,我强制将 HTML 读取为 PHP,因为我的设计团队使用 HTML 来连接每个页面,现在我没有更多的时间来编辑所有这些。但我意识到当我在我的 .htaccess 中使用这个命令时

AddType application/x-httpd-php .html

该代码用于将 HTML 强制读取为 PHP。但是当我这样做时,里面包含 PHP 的 HTML 页面无法读取里面的会话。这是我试图在 HTML 页面上打印的会话。会话是在用户登录时在登录页面上设置的。以及我主页上成功登录的用户的以下代码

<?php
session_start();
echo "halooo";
echo "The email is " . $_SESSION["email"] . "<br>";
echo "The data is " . $_SESSION["data"] . "<br>";
echo "test dataaaa";
?>

这不是全部代码。其他代码仅用于设计,我已经尝试删除其他代码,仍然无法打印会话。

我知道最好的方法是将 HTML 更改为 PHP,但如果有任何其他解决方案,我仍然可以强制将 HTML 读取为 PHP,但我也可以在 HTML 页面上打印会话,这将帮助我很多。谢谢

这是我设置会话变量的登录页面

<?php
session_start();



$alert="";
    
    
  include 'config.php';


    if(isset($_POST["login"]))
    {
        $usern = $_POST['username'];
        $pass = md5($_POST['password']);
        

        if($usern && $pass)
        {   
            $sql = "SELECT username, pass, usercode, status FROM client_login WHERE username = '$usern'";
            
            $result = mysqli_query($conn, $sql);

            if(!mysqli_num_rows($result))
            {
                $alert= '<div class="alert alert-warning" role="alert">
                    Data anda tidak ditemukan! Silahkan melakukan Sign Up terlebih dahulu. >> <a href="register.php" class="alert-link">Register</a> <<
                  </div>';

            }else{
                
                $row = mysqli_fetch_assoc($result); 

                if($row["username"] != $usern || $row["pass"] != $pass)
                {
                    $alert= '<div class="alert alert-warning" role="alert">
                   Username atau Password anda salah! Periksa kembali data anda!
                  </div>';

                }else
                {  
                    $sql2 = "SELECT username, nama, telp, email FROM clientdata WHERE username = '$usern'";
                    $result2 = mysqli_query($conn, $sql2);
                    $row2 = mysqli_fetch_assoc($result2);
                    
                    $_SESSION["username"]=$row["username"] ;
                    $_SESSION["usercode"]=$row["usercode"] ;
                    $_SESSION["email"]=$row2["email"] ;
                    $_SESSION["status"]=$row["status"] ;
                    $_SESSION["session"]= "active";
                    $_SESSION["data"]= "datatest";
                    
                    header('Location : client/home.html');

                }
            }

        }else{
            $alert= '<div class="alert alert-warning" role="alert">
                    Masukan username dan password!
                  </div>';
        }
    }
    mysqli_close($conn);

?>

【问题讨论】:

  • 没有明显的原因,为什么这会有所不同。您是否启用了正确的 PHP 错误报告?如果没有,请现在就先去做吧。
  • “无法读取里面的会话”是什么意思?您尝试过什么来解决问题?
  • 页面上的php是否起作用,唯一的问题是你没有得到echo里面的session信息?
  • 如何进行正确的 PHP 错误报告?你能给我具体的指示吗?谢谢@NicoHaase
  • 做什么?请分享更多详细信息,例如将此类数据写入会话的代码,以及您解决问题的尝试

标签: php html .htaccess


【解决方案1】:

所以 .htaccess 中的 AddType 正在设置 MIME 类型,以便在发送 .html 文件时传输到客户端。这是将 apache 配置为 SetHandler application/x-httpd-php。根据您的主机配置,您可能无法在 .htaccess 级别实际设置它。 要使用 php 解释器解析 .html 文件,您需要类似于以下内容。请仔细阅读您的用例文档。

<FilesMatch ".+\.html$">
    SetHandler application/x-httpd-php
</FilesMatch>

【讨论】:

  • 你好。感谢您的帮助。但是我尝试了您的 .htaccess 配置,但会话仍然没有打印。
  • 您可能无法在 .htaccess 中进行设置,这取决于您的主机允许从服务器配置中覆盖的内容。您需要从您的证明者文档中了解 SetHander 是否是允许的覆盖。 httpd.apache.org/docs/2.4/mod/core.html#sethandlerhttpd.apache.org/docs/2.4/mod/core.html#allowoverride 是 apache 文档的良好起点,但很少有提供商会将 AllowOverride 设置为 ALL,而 apache 的默认设置为 NONE
  • 我已经尝试直接从 Cpanel apache 处理程序进行配置并且处理程序正在工作我可以使用基本的 php 命令,但问题仍然是它仍然无法从 Session 变量中打印数据
  • 如果您将文件更改为 .php 文件,它可以工作吗?如果不是,我会检查您的 web 服务器的 php.ini 设置文件
  • 是的,如果我将文件扩展名更改为 .php 它的工作
【解决方案2】:

因为我的设计师团队使用 HTML 来连接每个页面,现在我没有更多时间来编辑所有这些

另一种解决方案/解决方法...维护所有指向.html URL 的内部链接,但将基础文件重命名为.php(这可能是“工作”)并在内部重写 URL在.htaccess 中使用Apache 的mod_rewrite 从.html.php。这样可以避免重命名“设计团队”创建的所有 .html 链接。

例如,内部链接是/about.html/foo/bar.html,但底层文件分别是/about.php/foo/bar.php。然后,在您的.htaccess 文件中将.html 重写为.php

RewriteEngine on

# Rewrite .html requests to .php
RewriteRule (.+)\.html$ $1.php [L]

上述规则是无条件的,它重写所有.html请求,无论目标.php文件是否存在。这通常不是问题,因为您只需在.php 而不是.html 上获得404。任何.html 文件都将无法访问。

如果您特别想在重写之前检查目标.php 是否存在,则将上述规则更改为:

# Rewrite .html requests to .php - if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.+)\.html$ $1.php [L]

这允许访问.html 文件,但如果同一文件同时存在.html.php,则.php 文件优先。

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 2019-10-07
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多