为什么我的apache Directory配置被忽略了?

时间:2017-08-25 07:34:24

标签: apache

我使用目录匹配规则限制了多个网站的IP部分。现在,我想允许新的IP只能访问其中一个站点。

安全文件夹是一个管理员指南(总是/admin),一些随机安全文件夹和WordPress管理区域,如果该网站碰巧有博客。他们<Directory ~>指令如下:

<Directory ~ "^/var/www/vhosts/[^/]+/public/((securefolder1)|(securefolder2)|((blog/)?wp\-)?admin)">
  AllowOverride All
  Order Deny,Allow
  Deny from all
  Allow from 111.111.111.111 222.222.222.222 333.333.333.333
</Directory>

我尝试通过在上面的指令之后添加此指令,允许新IP地址到特定的WordPress管理区域:

<Directory "/var/www/vhosts/foo.com/public/wp-admin">
  AllowOverride All
  Order Deny,Allow
  Deny from all
  Allow from 111.111.111.111 222.222.222.222 333.333.333.333 444.444.444.444
</Directory>

虽然原始IP仍然有效,但新IP仍然无法查看。我想知道是否与the order they are merged in有关,所以我将<Directory>更改为<Directory ~>以获取foo.com指令,但它仍然无法正常工作。我也尝试将其移动到之后另一个指令而没有效果。

如何覆盖此网站的IP限制?

注意: .htaccess解决方案是可以接受的。

Apache版本为2.2.15

1 个答案:

答案 0 :(得分:1)

这是合并订单问题

正如您所怀疑的那样,它有&#34;与他们合并的订单有关。&#34;

  

按顺序最短的目录组件处理到最长。例如,<Directory /var/web/dir>将在<Directory /var/web/dir/subdir>之前处理。

小心使用Apache合并订单

如果您再看一下这些文档,您会注意到:

  

合并的顺序是:

     
      
  1. <Directory>(正则表达式除外)和.htaccess同时完成(.htaccess如果允许,则覆盖<Directory>
  2.   
  3. <DirectoryMatch>(和<Directory ~>
  4.   
  5. <Files><FilesMatch>同时完成
  6.   
  7. <Location><LocationMatch>同时完成
  8.   

...这意味着您可以执行以下任何一项操作:

  1. foo.com目录条目创建为目录匹配
  2. 调整目录路径(使用一些聪明的正则表达式),使foo.com条目比主条目更长。
  3. 使用文件或位置条目定义访问权限(有点棘手,但仍然可行。
  4. 对于您的情况,它可能很简单:

    # regex not allowed here, adjust accordingly (three separate directory entries)
    <Directory "^/var/www/vhosts/[^/]+/public/((securefolder1)|(securefolder2)|((blog/)?wp\-)?admin)">
      AllowOverride All
      Order Deny,Allow
      Deny from all
      Allow from 111.111.111.111 222.222.222.222 333.333.333.333
    </Directory>
    
    <Directory ~ "/var/www/vhosts/foo.com/public/wp-admin">
      AllowOverride All
      Order Deny,Allow
      Deny from all
      Allow from 111.111.111.111 222.222.222.222 333.333.333.333 444.444.444.444
    </Directory>
    

    改进的解决方案

    # This should be reflective of the url
    <Location ~ "^/((securefolder1)|(securefolder2)|((blog/)?wp\-)?admin)">
      AllowOverride All
      Order Deny,Allow
      Deny from all
      Allow from 111.111.111.111 222.222.222.222 333.333.333.333
    </Location>
    
    <Directory "/var/www/vhosts/foo.com/public/wp-admin">
      AllowOverride All
      Order Deny,Allow
      Deny from all
      Allow from 111.111.111.111 222.222.222.222 333.333.333.333 444.444.444.444
    </Directory>
    

    注意,如果这些是共享服务器,则允许用户编写自己的.htaccess文件,COULD通过更改URL来覆盖Location指令以访问文件。在这种情况下,唯一剩下的解决方案是先前的<Directory>示例,或使用VHosts指令。