如何根据用户

时间:2017-07-27 16:19:42

标签: php html .htaccess redirect directory

我正在开发一个显示文件夹中文件的网页。我从开源网站"css-tricks"获得了这个网页。我想创建一种方法,根据用户的不同,标志将被重定向到仅为其指定的文件夹。我能够创建一个使用户登录的.htaccess和一个具有登录凭据的.htpasswd。

例如,

每个文件夹(folder1,folder2,folder3)中有3个用户(user1,user2,user3)和3个带index.php的文件夹。

当“user1”登录后,他们会被重定向到“folder1”, 如果“user2”登录,他们会被重定向到“folder2”或“folder3”,无论我希望他们重定向。

这可能与.htaccess文件或像php文件一样吗?

注意:PHP,.htaccess编码知识有限公司! :(

我希望有人可以帮助我或者指出我正确的方向,如果您需要任何额外的信息让我知道!谢谢!

下面的

是我的index.php

<!doctype html>
<html>
<head>
   <meta charset="UTF-8">
   <link rel="shortcut icon" href="./.favicon.ico">
   <title>Invoices</title>

   <link rel="stylesheet" href="./.style.css">
   <script src="./.sorttable.js"></script>
</head>

<body>
<div id="container">
	<h1>Directory Contents</h1>

	<table class="sortable">
	    <thead>
		<tr>
			<th>Filename</th>
			<th>Type</th>
			<th>Size</th>
			<th>Date Modified</th>
		</tr>
	    </thead>
	    <tbody><?php

	// Adds pretty filesizes
	function pretty_filesize($file) {
		$size=filesize($file);
		if($size<1024){$size=$size." Bytes";}
		elseif(($size<1048576)&&($size>1023)){$size=round($size/1024, 1)." KB";}
		elseif(($size<1073741824)&&($size>1048575)){$size=round($size/1048576, 1)." MB";}
		else{$size=round($size/1073741824, 1)." GB";}
		return $size;
	}

 	// Checks to see if veiwing hidden files is enabled
	if($_SERVER['QUERY_STRING']=="hidden")
	{$hide="";
	 $ahref="./";
	 $atext="Hide";}
	else
	{$hide=".";
	 $ahref="./?hidden";
	 $atext="Show";}

	 // Opens directory
	 $myDirectory=opendir(".");

	// Gets each entry
	while($entryName=readdir($myDirectory)) {
	   $dirArray[]=$entryName;
	}

	// Closes directory
	closedir($myDirectory);

	// Counts elements in array
	$indexCount=count($dirArray);

	// Sorts files
	sort($dirArray);

	// Loops through the array of files
	for($index=0; $index < $indexCount; $index++) {

	// Decides if hidden files should be displayed, based on query above.
	    if(substr("$dirArray[$index]", 0, 1)!=$hide) {

	// Resets Variables
		$favicon="";
		$class="file";

	// Gets File Names
		$name=$dirArray[$index];
		$namehref=$dirArray[$index];

	// Gets Date Modified
		$modtime=date("M j Y g:i A", filemtime($dirArray[$index]));
		$timekey=date("YmdHis", filemtime($dirArray[$index]));


	// Separates directories, and performs operations on those directories
		if(is_dir($dirArray[$index]))
		{
				$extn="&lt;Directory&gt;";
				$size="&lt;Directory&gt;";
				$sizekey="0";
				$class="dir";

			// Gets favicon.ico, and displays it, only if it exists.
				if(file_exists("$namehref/favicon.ico"))
					{
						$favicon=" style='background-image:url($namehref/favicon.ico);'";
						$extn="&lt;Website&gt;";
					}

			// Cleans up . and .. directories
				if($name=="."){$name=". (Current Directory)"; $extn="&lt;System Dir&gt;"; $favicon=" style='background-image:url($namehref/.favicon.ico);'";}
				if($name==".."){$name=".. (Parent Directory)"; $extn="&lt;System Dir&gt;";}
		}

	// File-only operations
		else{
			// Gets file extension
			$extn=pathinfo($dirArray[$index], PATHINFO_EXTENSION);

			// Prettifies file type
			switch ($extn){
				case "png": $extn="PNG Image"; break;
				case "jpg": $extn="JPEG Image"; break;
				case "jpeg": $extn="JPEG Image"; break;
				case "svg": $extn="SVG Image"; break;
				case "gif": $extn="GIF Image"; break;
				case "ico": $extn="Windows Icon"; break;

				case "txt": $extn="Text File"; break;
				case "log": $extn="Log File"; break;
				case "htm": $extn="HTML File"; break;
				case "html": $extn="HTML File"; break;
				case "xhtml": $extn="HTML File"; break;
				case "shtml": $extn="HTML File"; break;
				case "php": $extn="PHP Script"; break;
				case "js": $extn="Javascript File"; break;
				case "css": $extn="Stylesheet"; break;

				case "pdf": $extn="PDF Document"; break;
				case "xls": $extn="Spreadsheet"; break;
				case "xlsx": $extn="Spreadsheet"; break;
				case "doc": $extn="Microsoft Word Document"; break;
				case "docx": $extn="Microsoft Word Document"; break;

				case "zip": $extn="ZIP Archive"; break;
				case "htaccess": $extn="Apache Config File"; break;
				//case "exe": $extn="Windows Executable"; break;

				default: if($extn!=""){$extn=strtoupper($extn)." File";} else{$extn="Unknown";} break;
			}

			// Gets and cleans up file size
				$size=pretty_filesize($dirArray[$index]);
				$sizekey=filesize($dirArray[$index]);
		}

	// Output
	 echo("
		<tr class='$class'>
			<td><a href='./$namehref'$favicon class='name'>$name</a></td>
			<td><a href='./$namehref'>$extn</a></td>
			<td sorttable_customkey='$sizekey'><a href='./$namehref'>$size</a></td>
			<td sorttable_customkey='$timekey'><a href='./$namehref'>$modtime</a></td>
		</tr>");
	   }
	}
	?>

	    </tbody>
	</table>

	<!--<h2><?php //echo("<a href='$ahref'>$atext hidden files</a>"); ?></h2>-->
</div>
</body>
</html>

下面是我的htaccess

ErrorDocument 400 /.error.php
ErrorDocument 401 /.error.php
ErrorDocument 403 /.error.php
ErrorDocument 404 /.error.php
ErrorDocument 405 /.error.php
ErrorDocument 408 /.error.php
ErrorDocument 414 /.error.php
ErrorDocument 500 /.error.php
ErrorDocument 502 /.error.php
ErrorDocument 504 /.error.php
AuthType Basic
AuthName "My Protected Area"
AuthUserFile C:\\wamp64\\www\\Custom\\DisplayDirectoryContents/.htpasswd
Require valid-user
DirectoryIndex index.htm index.html index.shtml index.php default.php .index.php

下面是我的.htpasswd

UserNanme:EncryptedPassword

以下是我的.error.php

<?php

$status=$_SERVER['REDIRECT_STATUS'];
$codes=array(
       400 => array('400 Bad Request', 'The request cannot be fulfilled due to bad syntax.'),
       401 => array('401 Login Error', 'It appears that the password and/or user-name you entered was incorrect. <a href="#" onclick="window.location.reload()">Click here</a> to return to the login page.'),
       403 => array('403 Forbidden', 'The server has refused to fulfill your request.'),
       404 => array('404 Not Found', 'Whoops, sorry, but the document you requested was not found on this server.'),
       405 => array('405 Method Not Allowed', 'The method specified in the Request-Line is not allowed for the specified resource.'),
       408 => array('408 Request Timeout', 'Your browser failed to send a request in the time allowed by the server.'),
       414 => array('414 URL To Long', 'The URL you entered is longer than the maximum length.'),
       500 => array('500 Internal Server Error', 'The request was unsuccessful due to an unexpected condition encountered by the server.'),
       502 => array('502 Bad Gateway', 'The server received an invalid response from the upstream server while trying to fulfill the request.'),
       504 => array('504 Gateway Timeout', 'The upstream server failed to send a request in the time allowed by the server.'),
);
 
$errortitle = $codes[$status][0];
$message = $codes[$status][1];

?>

<!doctype html>
<html>
<head>
	<title>That's an Error!</title>
	<style>
	  html 
	{color:#333;
	 font-family: "Lucida Console", Courier, monospace;
	 font-size:14px;
	 background:#eeeeee;}
 
	.content
	{margin:0 auto;
	 width:1000px;
	 margin-top:20px;
	 padding:10px 0 10px 0;
	 border:1px solid #EEE;
     background: none repeat scroll 0 0 white;
     box-shadow: 0 5px 10px -5px rgba(0, 0, 0, 0.5);
     position: relative;
}

	h1
		{font-size:18px;
		 text-align:center;}

	h1.title 
		{color:red;}
	
	h2
		{font-size:16px;
		 text-align:center;}
	
	p 
		{text-align:center;}

	hr
		{border:#fe4902 solid 1px;}

	</style>
</head>

<body>

	<div class="content">
	<h1>Sorry, but that's an error!</h1>
	<h1 class="title"><?php echo $errortitle; ?></h1>
	<hr>
	<p><?php echo $message;?></p>
	</div>

</body>
</html>

1 个答案:

答案 0 :(得分:1)

好的,所以我快速模拟了PHP手册中的代码。我也对它进行了测试,并且完全符合您的要求。

请确保手头创建“用户名”文件夹,在我的示例中我有:'Norbert1','Norbert2','Norbert3',这意味着必须有一个名为'Norbert1'的文件夹,'Norbert2',' Norbert3' 。

<?php
ob_start();

$realm = 'Restricted area';

$users = [
        'Norbert1' => '123456', 
        'Norbert2' => '123456',
        'Norbert3' => '123456'
];


if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm. '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
    die('This website requires authorization');
}


// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($users[$data['username']]))
{
    header('HTTP/1.1 401 Unauthorized');
    die('Invalid Credentials or no such user exists!');
}

    // generate the valid response
    $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
    $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
    $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

    if ($data['response'] != $valid_response)
    {
        header('HTTP/1.1 401 Unauthorized');
        die('Invalid Credentials or no such user exists!');
    }
        // ok, valid username & password
        echo 'You are logged in as: ' . $data['username'] . PHP_EOL;

        header("Location: /". $data['username']."/");

        // function to parse the http auth header
        function http_digest_parse($txt)
        {
            // protect against missing data
            $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
            $data = array();
            $keys = implode('|', array_keys($needed_parts));

            preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

            foreach ($matches as $m) {
                $data[$m[1]] = $m[3] ? $m[3] : $m[4];
                unset($needed_parts[$m[1]]);
            }

            return $needed_parts ? false : $data;
    }
?>

其余的都是非常自我解释,祝你好运!