我可以将 VirtualDocumentRoot 产生的文档根目录用作同一 VirtualHost 中其他地方的变量吗?
以下面的 VirtualDocumentRoot 为例:
VirtualDocumentRoot "/var/workspaces/%1"
从主机名生成的文档根目录test.localhost
是/var/workspaces/test
。它在 php 中也可视为文档根目录$_SERVER['DOCUMENT_ROOT']
。
那么我可以在 apache 配置中的 PutEnv 或 Define 指令中使用实际文档根目录吗?apache 配置中是否有包含实际文档根目录的变量?
编辑:
我想将它用于几个不同的用例。
我想为我的所有应用程序设置一个日志目录,所以我想做这样的事情:
SetEnv LOG_DIR ${DOCUMENT_ROOT}/logs/
或者我想将 php-fpm 应用程序指向正确的方向:
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9764${DOCUMENT_ROOT}/$1
或者在文档根目录中的子目录上设置一些不同的指令:
<Directory "${DOCUMENT_ROOT}/bin">
答案1
首先,我想指出您的用例的期望状态可能存在某些安全问题。
为什么要将日志存储在 中DocumentRoot
?这会增加将日志公开的风险。当然,您可以使用新<Directory>
指令来防止这种情况,但将日志保存在不同的目录中更容易。从目录权限的角度来看,这也更易于管理,考虑到日志文件安全警告:
任何能够写入 Apache httpd 写入日志文件的目录的人几乎都可以访问启动服务器的 uid,通常是 root。不要在没有意识到后果的情况下授予人们存储日志的目录的写入权限;有关详细信息,请参阅安全提示文档。
此外,日志文件可能包含客户端直接提供的信息,而没有转义。因此,恶意客户端有可能在日志文件中插入控制字符,因此在处理原始日志时必须小心谨慎。
另一方面,如果使用mod_vhost_alias. 虽然使用动态配置的海量虚拟主机只有一个“通配符”容器,VirtualHost
用于所有customer-*.example.com
主要缺点是你不能为每个虚拟主机设置不同的日志文件;但是,如果你有许多虚拟主机,那么这样做可能不是一个好主意,因为所需文件描述符的数量. 最好记录到管道或 fifo,并安排另一端的进程将日志文件拆分成每个虚拟主机一个。可以在 split-logfile 实用程序中找到此类进程的一个示例。
看起来在这种情况下,设置需要满足这些要求:
- 这些“工作区”的数量是有限的
- 您希望每个工作区都有完全相同的配置
- 配置需要根据您的特殊需求进行定制
- 您希望更轻松地添加更多工作区,而无需添加新
VirtualHost
容器。
因此,考虑到所有限制mod_vhost_alias,我建议放弃它并使用mod_macro反而,因为它能够满足要求并且更加灵活。
包含您问题中的所有示例的示例宏(甚至不推荐的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
。