为什么在提供正确的用户/ pw后会重复弹出Basic AUTH框?

时间:2016-02-02 09:41:22

标签: php .htaccess cgi basic-authentication fastcgi

我正在编写一个非常简单的授权脚本,它只使用PHP标头来阻止非管理员访问其他网站。这个PHP脚本叫做authorize.php,通过

包含在其他文件中
<?php require_once('authorize.php'); ?>

在剩余的HTML代码之前。

这是脚本:

<?php
//User name and password for authentication
$username = 'rock';
$password = 'roll';
//these arent the real passwords of course...

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || ($_SERVER['PHP_AUTH_USER'] != $username) || ($_SERVER['PHP_AUTH_PW'] != $password)) {
//The user name/password are incorrect so send the authentication headers
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm= "Guitar Wars" ');
exit('<h2>Guitar Wars</h2>Sorry, but you do not have permission to view this page');
}
?>

就是这样。它根本不是花哨的,但由于某些原因,正确地输入用户/ pw只会导致AUTH框每次都弹出。

我嗤之以鼻地寻找答案,虽然我发现了一些类似的问题,但没有人真的解决了。例如: this 但我的标题是在if语句中... 或this one 其中的问题没有真正回答...... 我甚至尝试过这个......

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

根据我发现的其他内容进入根目录的.htaccess,但这没有帮助,老实说,我甚至不知道它的作用......

我确实检查了我的php信息,看起来像它的CGI / fastCGI。

这里有什么问题?我几乎从我正在学习的教科书中复制了代码verbatum(我是一名英语教授,而不是程序员介意你,所以请温柔地对待我)

1 个答案:

答案 0 :(得分:0)

我在搜索2天后找到了问题的答案...我上面编辑.htaccess文件的想法只是部分正确。我需要将它包含在.htaccess文件中

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>

然后在我的PHP脚本中,我在上面创建了标题,包括:

if(preg_match('/Basic+(.*)$/i', $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], $matches))
{
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 6)));
}

我只是一个初学者,所以我完全不知道其中的任何一个,但是嘿,它解决了这个问题。如果其他人遇到这个问题,请允许我详细说明我注意到的其他一些事情,这样你就可以将你的情况与我的情况进行比较。

  1. 我有一个ipage帐户,而这正是我所做的一切。它似乎是Apache 2。
  2. phpinfo表明它正在运行FastCGI / CGI
  3. 在$ _SERVER上调用var_dump没有显示PHP_AUTH_USER或PHP_AUTH_PW索引,虽然它确实显示了REMOTE_USER,它似乎至少存储了用户名输入。
  4. 我找到了答案here.