我可以使用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。
看来在这种情况下,设置需要满足这些要求 :
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。