通过PHP验证Apache目录

时间:2011-03-08 13:57:32

标签: php apache curl http-basic-authentication

大家好日子,

我有一个目录设置了一些Apache Auth的东西。这是目录: http://gojalapeno.com/intranet/content/ado-jeune

使用ado-jeune:tezesyrab登录。

以下是为其提供支持的.htaccess的代码:

AuthName "Connexion au dossier:"
AuthType Basic
AuthUserFile "D:\Dropbox\htaccess\secret\.htpasswd"
Require valid-user

现在,该目录的登录表单由浏览器生成,但我希望使用自己的HTML表单。我该怎么做?我尝试过使用cURL和PHP:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gojalapeno.com/intranet/content/ado-jeune');
curl_setopt($ch, CURLOPT_USERPWD, 'ado-jeune:tezesyrab');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);

认证很好,但问题是它没有重定向到页面(尽管有CURLOPT_FOLLOWLOCATION),它只是“包含”在当前文件中。因此,我所有的相关链接都被打破了。

所以我正在寻找的方法是使用我自己的HTML表单对Apache Basic Auth目录进行身份验证,并在之后重定向到该目录。

谢谢!

2 个答案:

答案 0 :(得分:2)

不幸的是,由于AuthBasic的工作方式,您所描述的内容很难实现。来自Apache's documentation

  

由于指定基本身份验证的方式,每次从服务器请求文档时都必须验证您的用户名和密码。即使您正在重新加载同一页面以及页面上的每个图像(如果它们来自受保护的目录),这也是如此。

浏览器会在用户输入后自动为每个后续请求发送用户凭据。

但是在你的情况下,浏览器本身并没有连接到受保护的目录,而是cURL。一种解决方案是让cURL处理对该受保护目录的所有请求,实质上充当代理。

要实现此目的,您必须编写一个PHP脚本来请求用户的凭据,并在它请求受保护目录中的页面时发送它们。所以像这样:

<?php

    // This is *very* basic - you would of course need to make sure the user 
    // isn't trying to access something in another location
    $dest = $_GET["dest"];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://gojalapeno.com/intranet/content/' . $dest);

    // You would retrieve the user's credentials from an HTML form and save them in session vars
    curl_setopt($ch, CURLOPT_USERPWD, $_SESSION["username"] . ":" . $_SESSION["password"]);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    curl_exec($ch);

    curl_close($ch);

?>

希望这有帮助!

答案 1 :(得分:0)

也许您可以定义自己的错误文档,其中包含.htaccess中的表单:

ErrorDocument 401 /my_custom_password_form.html

请参阅http://httpd.apache.org/docs/2.0/custom-error.html