2011-02-08 88 views
6

由于某些原因,我无法使用基本身份验证在我的服务器上使用PHP。我正在使用手册页中的确切代码:使用PHP进行基本身份验证会产生无限循环

<?php 
if (!isset($_SERVER['PHP_AUTH_USER'])) { 
    header('WWW-Authenticate: Basic realm="My Realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo 'Text to send if user hits Cancel button'; 
    exit; 
} else { 
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; 
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>"; 
} 
?> 

但是,当我运行它时,我无法超越提示。

如果我把这个相同的代码放在我的其他服务器上,它可以正常工作。

有谁知道可能是什么原因造成的?这两个服务器都是WAMP堆栈,并且Apache启用了auth_basic_module。 PHP.ini文件实际上也是相同的。

我瞥了头,在输入用户名/密码后,发送了“Authorization:Basic XXXXXX”标头。

+0

在两个`php.ini`文件中尝试`diff`,以防万一您丢失了某些东西。你也可以比较apache confs。 – ocodo 2011-02-08 00:13:17

+0

参考:http://www.php.net/manual/en/features.http-auth.php – 2011-02-08 00:13:20

回答

9

这取决于使用的PHP接口。环境变量PHP_AUTH_USER仅用于mod_php,如果Apache帮助。

如果您从脚本初始化授权,那么您必须查找HTTP_AUTHORIZATION标题,然后解码并自行分割它。看看这个评论:http://www.php.net/manual/en/features.http-auth.php#94349

对于FastCGI设置或suexec invokations,你甚至可能在环境变量中没有这个头文件。它被过滤掉作为安全预防措施。常见的解决方法是使用一个htaccess的规则改写头:

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

因此它变得可用具有混合情况下$_SERVER["HTTP_Authorization"]

相关问题