2013-07-31 18 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 –

相关问题