Ubuntu

如何在 Apache 中為個人使用者目錄設置身份驗證?

  • September 13, 2018

public_html我在我的目錄中為我的個人設置了身份驗證home,但它沒有效果。即,我應該得到一個彈出視窗,詢問我的憑據,但這不會發生。身份驗證適用於伺服器根目錄中的目錄,並且執行正常。現在我正在重組伺服器。

這裡有更多細節。有一些與配置文件相關的附帶問題和問題,我用粗體表示

  • 我有主 HTTP 目錄/var/www/html和 HTTPS 相同。
  • 那裡只有一個文件,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 的一般方法有任何意見,請發表評論。

關鍵是Limit指令。線索出現在 mod Apache 文件頁面的Directive部分<Limit>core

當與指令一起使用<Limit>or<LimitExcept>指令時Require ,請注意第一個Require成功的授權請求,無論是否存在其他Require指令。

事實證明,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上面清單的第二行中的內容。它下面的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>

第一行成功並授權請求。

引用自:https://unix.stackexchange.com/questions/368900