使用 .htaccess 文件时登录(使用 SQL)时出现问题?

Tim*_*mer 1 html php mysql .htaccess redirect

SO社区晚上好,

我最近在做一个网络项目,遇到了一个有趣的问题,我在互联网上进行了搜索,但无法解决它。这是发生的事情。

当用户访问该网站时,它会自动将他们引导至登录页面。他们只需输入用户名和密码,然后单击登录按钮/链接(或按 Enter 键),它将向 SQL Server 发送请求以验证密码,然后登录用户,为用户数据设置会话变量。简单吧?效果太棒了!(没什么可幸灾乐祸的。简单的 PHP/SQL)无论如何,我继续从事这个项目并取得了很大的进展。一直以来,登录系统都运行良好。我每天都必须登录,而且没有出现任何问题。

我决定将文件扩展名从 URL 中删除(website.com/index.html 改为 website.com/index 或 website.com/dashboard.php 改为 website.com/dashboard)。在对该主题进行了一些研究后,我发现可以通过使用 .htaccess 文件和少量代码来相当轻松地完成此操作。我创建了一个 .htaccess 文件并将以下代码放入其中,然后将其上传到我的服务器。我刷新了页面并尝试了几个链接,发现它实际上删除了文件扩展名。我很自豪哈哈!不管怎样,我继续从事这个项目,没有出现任何问题。一天结束时,我注销并关闭了计算机。第二天,我去登录,它说登录时出错(当在 SQL 服务器中找不到用户名/密码组合的匹配项时,我的自定义错误消息)。我又尝试了几次都没有成功。恼怒之下,我登录到控制面板和 SQL 管理器进行检查,以确保信息准确无误。它是。我想到了前一天所做的事情可能会影响登录系统,并将其范围缩小到 .htaccess 文件。我启动了 FTP 并从服务器中删除了该文件,然后尝试使用相同的信息再次登录。你猜怎么了?有效!

前一天处理它时没有引起任何问题,因为每当我上传文件时我就已经登录了。为了让我登录,我必须删除 .htaccess 文件,登录,然后重新上传。我想不通这个。运气好的话,我可能错过了一些简单的事情。请参阅下面的代码,如果您需要更多信息,请告诉我。(希望我涵盖了所有内容。)

.htaccess

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_FILENAME}.html [L]

RewriteCond %{HTTP_HOST} ^subDomain\.website\.com$ [NC]
RewriteRule ^(.*) http://www.subdomain.com/$1 [L,R]

RewriteCond %{HTTP_HOST} ^www.subDomain\.website\.com$ [NC]
RewriteRule ^(.*) http://www.subdomain.com/$1 [L,R]
Run Code Online (Sandbox Code Playgroud)

最后四行代码用于将 URL 的子域重定向到完全不同的域。例如:subdomain.website.com 将重定向到 subdomain.com。

登录.php

<?
    session_start();
    $_SESSION["LOGGEDIN"] = "FALSE";
    $_SESSION["NAME"] = "NULL";
    require_once 'myConnectionFile.php';

    $uCheck = $_POST['uName'];
    $uCheck = strtoupper($uCheck);
    $pCheck = $_POST['pWord'];



    //echo "Attempting to log in " . $uCheck . "!<br><br>";
    //echo "";

    $sql = "SELECT id FROM USERNAMES WHERE uName = '$uCheck' and PASSWORDS = '$pCheck'";
    // echo $uCheck . " " . $pCheck;
    $result = mysqli_query($conn,$sql);
    $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
    // $active = $row['active'];
    $count = mysqli_num_rows($result);

    if($count == 1) {
        //echo "Logged in!<br>";
        $_SESSION["LOGGEDIN"] = "TRUE";
        $_SESSION["NAME"] = $uCheck;
        //echo $_SESSION["LOGGEDIN"];
        $sql_SESSION = "SELECT * FROM USERNAMES WHERE uName='$uCheck'"; 
        $result_SESSION = mysqli_query($conn,$sql_SESSION);
        if ($result_SESSION->num_rows > 0) {
            while($row_SESSION = $result_SESSION->fetch_assoc()) {
                $_SESSION["USER"] = $row_SESSION['uName'];
                // LOAD SESSION VARIABLES HERE
            }
        }

        header('Location: http://www.website.com/Dashboard.php');
    } else {
        echo "Error logging in!";
        header('Refresh: 3; URL=destroySessions.php');
    }

    // session_unset(); <- Unsets all session variables.
    // session_destroy(); <- Destroys (Removes) a session.
?>
Run Code Online (Sandbox Code Playgroud)

请记住,出于安全目的,我更改了一些信息。

查看代码后,您能看出 .htaccess 文件阻止我/用户登录我的系统的任何原因吗?

任何建议将不胜感激!

提前致谢,

蒂姆

Ult*_*ter 5

302 和 301 重定向将丢失 POST 数据并变成 GET 请求。一个好的解决方案是使用 307 重定向,因为它在重定向期间仍然是 POST 请求:

RewriteRule ^ %1 [R=307,L,NC]
Run Code Online (Sandbox Code Playgroud)