【问题标题】:Let Apache serve multiple directories through single <Location>让 Apache 通过单个 <Location> 服务多个目录
【发布时间】:2010-10-14 15:59:33
【问题描述】:

我在为大量虚拟主机提供服务时遇到了问题,我想知道是否有更有效的处理方式。

我目前正在使用 Location 指令为来自不同部门的大量项目提供服务,总共来自 19 个部门的 300 多个项目。除了提供文件的目录之外,每个 Location 指令的结构都是相同的。我目前拥有的是一个看起来像这样的大文件:

<VirtualHost *> 
   ServerName www.myserver.com 

   <Location /departmentA/project1> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project1/passwords 
      Require valid-user 
   </Location> 

   <Location /departmentA/project2> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project2/passwords 
      Require valid-user 
   </Location> 

   <Location /departmentB/project1> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project1/passwords 
      Require valid-user 
   </Location> 
</VirtualHost>

正如您所见,除了路径之外,所有这些结构都是相同的。我想要的当然是我可以为部门和项目名称使用变量并只维护一个 Location 指令。我认为这对服务器和内存的负担也较轻。

<VirtualHost *> 
   ServerName www.myserver.com 

   <Location /$1/$2> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/$1/$2/passwords 
      Require valid-user 
   </Location> 
</VirtualHost>

【问题讨论】:

    标签: apache virtualhost


    【解决方案1】:

    你试过<LocationMatch> directive吗?

    它采用正则表达式而不是路径。根据您的路径及其相关的子选项,您可以将数百个指令减少到更易于管理的少数几个。

    【讨论】:

    • 但是 LocationMatch 能够将这些变量传递给 AuthUserFile 吗?如果是,怎么做?
    【解决方案2】:

    我不知道有什么具体方法可以做到这一点,因为我认为AuthUserFile 不接受动态参数。用您选择的语言编写一个小脚本可能是最简单的,该脚本采用 &lt;Location&gt; 块的模板并为您要保护的每个目录重复它。示例,在 Python 中:

    #!/usr/bin/python
    import sys
    print '<VirtualHost *:80>'
    print '   ServerName www.myserver.com'
    for path in sys.stdin:
        print '   <Location /%s>' % path.strip()
        print '      AuthType Basic'
        print '      AuthName "By Invitation Only"'
        print '      AuthUserFile /usr/local/%s/passwords' % path.strip()
        print '      Require valid-user'
        print '   </Location>'
    print '</VirtualHost>'
    

    对于它在标准输入上读取的“departmentA/project1”表格的每一行,它会打印出相应的&lt;Location&gt; 部分。

    【讨论】:

    • 嗨。我明白你在说什么。但是,我不太明白如何整合它。你的意思是 Apache 可以实时调用它,还是我必须预先生成每个位置?
    • 不,Apache 无法自动执行此操作。每次要更改受保护位置集(然后需要重新加载 Apache)时,都需要运行它来重新生成 Apache 配置。我认为这不是你需要经常做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多