如何在 Apache 中为个人用户目录设置身份验证?

如何在 Apache 中为个人用户目录设置身份验证?

public_html我在我的目录中设置了个人身份验证home,但没有效果。即,我应该弹出一个窗口,询问我的凭据,但这并没有发生。身份验证在服务器根目录中的目录中运行良好,并且工作正常。现在我正在重组服务器。

以下是更多详细信息。有一些与配置文件相关的附带问题和疑问,我将其放在粗体

  • 我有主 HTTP 目录,/var/www/htmlHTTPS 也有相同的目录。
  • 那里只有一个文件,其中index.html有一个指向我个人~tomasURL 的链接。效果很好。我正在使用userdirmod 进行映射~tomas
  • 我还有一个个人cgi-bin目录,CGI 工作正常,但我想要 URL~tomas/cgi-bin 显示目录列表,由于某种原因不起作用,我收到 403 Forbidden。
  • 我希望主目录可以在 HTTPS 和 HTTP 中使用并且无需授权。但是一旦客户端通过以下方式请求个人public_html目录之一~user,就应该对访问进行身份验证,并且身份验证应通过 HTTPS 进行。所以HTTP需要切换到HTTPS。我已经设置并测试了 HTTPS 设施,但尚未在此上下文中设置任何强制措施。如果重要的话,我没有 FQDN。

然而,主要问题是,如何让身份验证本身起作用~user,即使是通过 HTTP。

我把所有的配置都放进去了userdir.conf猜测问题是在 中使用通配符/home/*/public_html

这是userdir.conf.

<IfModule mod_userdir.c>
        UserDir "public_html"
        UserDir disabled
        UserDir enabled tomas

        <Directory "/home/*/public_html">
                AllowOverride FileInfo AuthConfig Limit Indexes
                Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
                <Limit GET POST OPTIONS>
                        Require all granted
                </Limit>
                <LimitExcept GET POST OPTIONS>
                        Require all denied
                </LimitExcept>
                AuthType Basic
                AuthName "Personal HTML"
                AuthUserFile "/usr/share/apache2/passwd/passwords"
                Require valid-user
                SSLOptions +StdEnvVars
        </Directory>

        <Directory "/home/*/public_html/cgi-bin">
                Options ExecCGI Indexes
                SetHandler cgi-script
        </Directory>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

如果您对此配置文件或我对 Apache 的总体方法有任何意见,请发表评论。

答案1

关键是Limit指令。线索存在于<Limit>指令部分mod Apache 文档页面的core

<Limit>当将or<LimitExcept>指令与指令一起使用时,请注意,无论是否存在其他指令Require ,第一个成功的都会授权请求。RequireRequire

事实证明,第一个Require与当前案例匹配的决定了它的处理方式。根据我的问题的配置,那就是:

            <Limit GET POST OPTIONS>
                    Require all granted
            </Limit>
            <LimitExcept GET POST OPTIONS>
                    Require all denied
            </LimitExcept>
            AuthType Basic
            AuthName "Personal HTML"
            AuthUserFile "/usr/share/apache2/passwd/passwords"
            Require valid-user

通过一个简单的 GET 请求,Require all granted上面列表的第二行中的 GET 请求就完成了这项工作。它AuthType Basic下面的行和其他行都是死代码。正确的做法是:

            <Limit GET POST OPTIONS>
                    AuthType Basic
                    AuthName "Personal HTML"
                    AuthUserFile "/usr/share/apache2/passwd/passwords"
                    Require valid-user
            </Limit>
            <LimitExcept GET POST OPTIONS>
                    Require all denied
            </LimitExcept>

顺便说一句,这是该指令被忽略的情况Limit

            Require all granted
            <Limit GET POST OPTIONS>
                    AuthType Basic
                    AuthName "Personal HTML"
                    AuthUserFile "/usr/share/apache2/passwd/passwords"
                    Require valid-user
            </Limit>
            <LimitExcept GET POST OPTIONS>
                    Require all denied
            </LimitExcept>

第一行成功并授权请求。

相关内容