【问题标题】:Authenticate Apache directory over PHP通过 PHP 验证 Apache 目录
【发布时间】:2011-03-08 13:57:32
【问题描述】:

大家好,

我有一个目录,里面有一些 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 表单。我该怎么做?我试过在 PHP 中使用 cURL:

$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 目录进行身份验证并在之后重定向到该目录的方法。

谢谢!

【问题讨论】:

    标签: php apache curl basic-authentication


    【解决方案1】:

    不幸的是,由于 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);
    
    ?>
    

    希望这会有所帮助!

    【讨论】:

    • 我以前尝试过,但问题是我有要显示的 HTML 页面。这意味着所有指向图像、CSS 的链接以及这些页面上的链接本身都会使用这种技术中断。
    【解决方案2】:

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

    ErrorDocument 401 /my_custom_password_form.html
    

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

    【讨论】:

    • 这只是改变了“错误登录”页面。我需要做的是一种将凭据传递给 Apache 而不是浏览器的 Auth 表单的方法。
    • 怀疑浏览器从标头中读取 401 错误代码并按照其编程方式进行操作。我认为您无法从服务器端影响这一点。
    • 嗯,cURL 可以做到,至少 auth 部分。
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2010-12-11
    • 2012-10-29
    • 2013-10-28
    • 1970-01-01
    • 2015-06-08
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多