2013-07-31 25 views
1

我們使用Apache-2.4提供的新認證和授權框架,並且需要關閉整個站點(位置/)以進行未經授權的訪問,除了一個子目錄(Location/foo),其中可以獲得授權cookie。這似乎是AuthMerging是使用該指令,但事情不工作:Apache 2.4 - 如何關閉除一個子目錄以外的整個站點?

<Location /> 
      AuthType    form 
      AuthFormProvider  foo 
      Session     On 
      SessionCookieName  ti2f 
      Include     conf/sessionpw.conf 
      AuthName    TI 
      <RequireAll> 
        Require   foo ipaddress 
        Require   foo expiration 
      </RequireAll> 
      ErrorDocument   401  /foo/ 
    </Location> 

    <Location /foo> 
      AuthMerging Or 
      Require all granted 
      DirectoryIndex index.php 
    </Location> 

不幸的是,進入/富仍受阻 - 401未授權。隨着LogLevel的手搖我可以看到mod_authz_core記錄了以下消息:

authorization result of Require all granted: granted 
authorization result of <RequireAny>: granted 
authorization result of AuthMerging Any: granted 
authorization result of Require all granted: granted 
authorization result of <RequireAny>: granted 
authorization result of AuthMerging Any: granted 
authorization result of Require foo ipaddress: denied (no authenticated user yet) 
authorization result of Require foo expiration: denied (no authenticated user yet) 
authorization result of <RequireAll>: denied (no authenticated user yet) 
authorization result of <RequireAny>: denied (no authenticated user yet) 

與AuthMerging設置爲「或者」爲sublocation /富,爲什麼阿帕奇檢查父位置的需要,指示不惜一切後,「要求所有批准「補助金?

回答

0

一些調試後,我能理出頭緒。關於Apache授權核心的奇怪之處(據報道,Apache-2.2的情況更糟糕)是規則(如果有的話)可能會在每次命中時應用多次。例如,在上面的情況下,對於相同請求發生三次 - 對於「/ foo /」

  1. 對於實際的「/ foo /」。這是根據Location/foo /的規則處理的,並按預期授予。
  2. 對於「/foo/index.php」。這也是根據Location/foo /的規則處理的,並且是偶然授予的。這解釋了爲什麼我看到每次擊中記錄有兩次這樣的授予。
  3. 因爲我們使用PHP FPM來處理PHP文件,請求再次通過authz規則 - 如「/php-fpm/foo/index.php」。這次它必須通過頂層Location /,因爲它從來沒有發生過我們,我們還需要一個單獨的Location/php-fpm /以及...

當前Apache的行爲是否越野車或者僅僅是奇數仍是辯論,但我的解決辦法是這樣來形容我的sublocation:

<LocationMatch ^(/php-fpm)?/foo/> 
      Require   all granted 
      DirectoryIndex index.php 
    </LocationMatch> 

AuthMerging甚至沒有必要在這種情況下。或者我也可以添加另一個位置 - for/php-fpm /。無論哪種方式,一旦問題被理解,解決方案是可用的...

0

使用LocationMatch代替:

<LocationMatch "!^/foo"> 
    # lock down everything EXCEPT /foo 
</LocationMatch> 
+0

謝謝,馬克。這可能工作。但我仍然困惑,爲什麼我的方法不工作。如果AuthMerging設置爲Or,Apache爲什麼應用更高位置的規則? –

+0

事實上,它不會很簡單地工作 - 請參閱我對自己問題的回答...沒有authz規則的位置不是/ foo /,而是/php-fpm/foo/index.php –

相關問題