Apache VirtualDocumentRoot作为variables

我可以使用VirtualDocumentRoot生成的文档根作为同一个VirtualHost中其他地方的variables吗?

以下面的VirtualDocumentRoot为例:

VirtualDocumentRoot "/var/workspaces/%1" 

从主机名test.localhost生成的文档根目录是/var/workspaces/test 。 这也是php中的$_SERVER['DOCUMENT_ROOT']中的文档根目录。

那么我可以在apacheconfiguration中使用PutEnv或Define指令中的实际文档根目录吗? 在实际的文档根目录的Apacheconfiguration中是否有一个variables?

编辑:

我想用这个几个不同的用例。

我想为我的所有应用程序设置一个日志logging目录,所以我想要做这样的事情:

 SetEnv LOG_DIR ${DOCUMENT_ROOT}/logs/ 

或者我想把php-fpm应用程序指向正确的方向:

 ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9764${DOCUMENT_ROOT}/$1 

或者在文档根目录下的子目录中设置一些不同的指令:

 <Directory "${DOCUMENT_ROOT}/bin"> 

首先,我想指出你的用例的期望状态可能有一定的安全问题。

你为什么要在DocumentRoot存储日志? 这增加了向公众公开日志的风险。 当然,您可以通过一个新的<Directory>指令来防止这种情况,但是将日志保存在不同的目录中会更容易。 考虑到日志文件安全性警告 ,从目录权限的angular度来看,它也更易于pipe理:

任何可以写入Apache httpd正在写日志文件的目录的人,几乎都可以访问服务器启动的uid,通常是root。 不要让人们在不知道后果的情况下写入存储日志的目录, 详细信息请参阅安全性提示文档。

另外,日志文件可能包含客户直接提供的信息,而不会转义。 因此,恶意客户端可能会在日志文件中插入控制字符,因此在处理原始日志时必须小心。

另一方面,如果使用mod_vhost_alias ,则不能为每个虚拟主机分隔日志文件。 虽然使用dynamicconfiguration大规模虚拟主机的动机是所有customer-*.example.com只有一个“通配符” VirtualHost容器customer-*.example.com

主要缺点是每个虚拟主机不能有不同的日志文件; 然而,如果你有许多虚拟主机,那么这样做可能是一个坏主意,因为需要的文件描述符的数量 。 最好login到一个pipe道或FIFO ,并安排在另一端的进程将日志文件分成一个虚拟主机。 这个过程的一个例子可以在split-logfile实用程序中find。


看来在这种情况下,设置需要满足这些要求

  • 你有这些“工作空间”的数量有限
  • 您希望为每个工作空间configuration完全相同的configuration
  • configuration需要根据您的特殊需求进行定制
  • 您希望在不添加新的VirtualHost容器的情况下更容易地添加更多的工作区。

因此,考虑到mod_vhost_alias的所有限制,我build议放弃它,并使用mod_macro来代替 ,因为它符合要求,而且更加灵活。

一个macros的例子,从你的问题的所有例子(甚至不build议LOG_DIR ):

 <Macro Workspace $workspace> <VirtualHost *:80> ServerName $workspace.localhost DocumentRoot "/var/workspaces/$workspace" SetEnv LOG_DIR "/var/workspaces/$workspace/logs/" ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9764/var/workspaces/$workspace/$1 <Directory "/var/workspaces/$workspace"> Require all granted </Directory> <Directory "/var/workspaces/$workspace/logs"> Require all denied </Directory> </VirtualHost> </Macro> 

现在,您可以添加所有的工作区:

 Use Workspace test Use Workspace another Use Workspace third 

与mod_vhost_alias不同的是,您仍然可以为每个工作空间定制一个自定义域。 只要修改<Macro Workspace $workspace $hostname>ServerName $hostname ,您就可以使用带有Use Workspace testwithdomain example.com的macros。