5

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

我目前正在使用 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>
4

2 回答 2

3

您是否尝试过<LocationMatch> 指令

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

于 2011-02-16T20:59:04.427 回答
1

我不知道有什么具体方法可以做到这一点,因为我认为不AuthUserFile接受动态论证。用您选择的语言编写一个小脚本可能是最简单的,该脚本采用<Location>块模板并为您要保护的每个目录重复它。例如,在 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”表单的每一行,它都会打印出相应的<Location>部分。

于 2009-03-20T22:07:18.507 回答