Htaccess或html:重定向到重写的URL

时间:2014-12-06 07:48:40

标签: html .htaccess apache2

[重编辑]

我目前通过以下方式使用.htaccess文件进行访问限制:AuthName; AuthUserFile和AuthGroup指令。

我希望有一个受htaccess保护的'用户重定向'页面,当提示输入登录凭据时,会通过.htaccess文件重定向到用户区域。每个用户区域在其自己的目录中包含不同的内容,因此我需要将用户名重写到URL的末尾。

例如:

来自:

  

https:// www.domain.com/index.html

致:

  

https:// www.domain.com/{user1}/index.html for user1

或者:

  

https:// www.domain.com/{user2}/index.html for user2

到目前为止,这是我通过推断混杂在一起的最佳方式:

RewriteEngine on 
RewriteCond $1!^user1/ 
RewriteCond %{REMOTE_USER} ^user1$ [NC] 
RewriteRule (.*) https:// www.domain.com/user1/$1 [L] 
RewriteCond $1!^user2/ 
RewriteCond %{REMOTE_USER} ^user2$ [NC] 
RewriteRule (.*) https:// www.domain.com/user2/$1 [L]

或可能

RewriteEngine On
RewriteCond %{REQUEST_URI} !/.+/
RewriteCond %{REMOTE_USER} (.+)
RewriteRule (.*) /%1/$1 [L,R=302]

是正确的和/或有更好的方法吗?最好不要为每个用户添加行

注意/编辑:Php目前对我来说有点复杂。关于php的查询现已删除。

干杯。

2 个答案:

答案 0 :(得分:0)

这是一个非常(我的意思是非常)基本(和截断)登录情况的一般工作流程。如果你不了解PHP(这听起来你不是这样),那么你自己就不可能做到这一点,因为“我认为 - 我会采取一个破解这个”的计划。您可能想尝试像Wordpress这样的现成解决方案。

<强>的login.php

<html>
    <head>
        <title>Login page</title>
    </head>
    <body>
        <form method="POST" action="process.php">
            User: <input type="text" name="username" value="" />
            Pass: <input type="password" name="password" value="" />
            <input type="submit" name="login" value="Login" />
        </form>
    </body>
</html>

<强> process.php

session_start();
// Add whatever your database connection is...this is a PDO example...
include_once('database.config.php');
if(isset($_POST['username'])) {

    // absurdly-simplified validation...
    $username = (!empty($_POST['username']))? $_POST['username']:false;
    $password = (!empty($_POST['password']))? $_POST['password']:false;

    // If validate input is good
    if($username != false && $password != false) {
            // Encrypt password however it's stored in your db
            $password = whatever_encrypt_thing($password);

            // Do a call to your database
            $query = $con->prepare("select * from users where username = :username and password = :password");
            $query->execute(array(':username'=>$username,':password'=>$password));
            // etc...do code to validate user and assign $_SESSION stuff.
            // Lets pretend $valid is the final return...

            if($valid == true)
                // Redirect to success page where each user gets their links
                header('Location: success.php');
            // Stop script from further processing.
            exit;
        }
}

// Redirect to login
header('Location: login.php?error=login');

答案 1 :(得分:0)

您通常不希望使用表单的action = ""方法来重定向用户。 action方法用于决定表单的值(存储在$ _POST或$ _GET数组中,具体取决于您的表单的方法)的位置,以便进行验证,处理或其他任何您想要使用它的方法。如果您的代码需要,验证,处理或其他任何您想要使用的页面将保留重定向请求(通常使用header()函数)。 @Rasclatt发布了一个很好的代码示例。

为了给你另一个例子,这是代码看起来如何的伪代码版本。 @ Rasclatt的答案在您对数据库的处理方面更加详细。类似于他的函数将用于下面的userHasRegisteredEmail()userHasMatchingPasswords()函数。以下是允许用户通过将脚本发送回包含表单的页面进行登录的表单。

<?php
session_start();
$servername = "localhost";
$username = "username";
$password = "password";

//Connect to database
try {
    $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
    // set the PDO error mode to exception only for development mode
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }

//Checks the $_POST array to see if it contains 'submit'. If so, you know the form was submitted
if (isset($_POST['submit'])) {

    //Declare variables and reset Form Values
    $email = $password = null;

    //Store form values. Trim() is used to erase excess whitespace in form values.
    $email = trim($_POST['email']);
    $password = trim($_POST['password']);

    //You can add some validation here if you'd like.

    //Process Form Values
    if (userHasRegisteredEmail() && userHasMatchingPassword()) {
          logUserIn();
          header('location: user-profile.php'); //REDIRECT USER TO PROFILE PAGE
          exit(); //Ensures that the rest of the script isn't run after redirection
    } else {
          showUserLogInError();
    }
}
?>

<html>
    <head>
        <title>Login page</title>
    </head>
    <body>
        //Leaving form's action empty, i.e. action="", will send the form values back to the current page
        <form method="POST" action="">
            User: <input type="text" name="username" value="" />
            Pass: <input type="password" name="password" value="" />
            <input type="submit" name="login" value="Login" />
        </form>
    </body>
</html>

我希望这会有所帮助。此外,像这样的东西是轻而易举的PHP和PHPAcademy's youtube videos有一些很棒的教程。我希望这有帮助。干杯