是否可以在 Apache 配置文件中使用变量?
例如,当我使用 Django+WSGI 设置站点时,配置文件可能如下所示:
<Directory /path/to/foo/>
Order allow,deny
Allow from all
</Directory>
Alias /foo/static /path/to/foo/static
WSGIScriptAlias /foo /path/to/foo/run_wsgi
我想将 '/path/to/foo' 变成一个变量,这样它只需要在一个地方定义。例如:
Variable FOO /path/to/foo
…
谢谢!
答案1
你可以使用mod_macro,自 Apache httpd 以来版本 2.4
在此之前,必须单独安装,请参阅mod_macro. 例如在 Debian 上:apt-get install libapache2-mod-macro; a2enmod macro
。
示例配置
/etc/apache2/conf.d/vhost.macro
<Macro VHost $host $port>
<VirtualHost $host:$port>
ServerName $host
DocumentRoot /var/vhosts/$host
<Directory /var/vhosts/$host>
# do something here...
</Directory>
</VirtualHost>
</Macro>
/etc/apache2/sites-available/vhost.mysite.com
Use VHost vhost.mysite.com 80
答案2
使用关键字更简单Define
。参见定义指令。
Define RVM_ROOT /opt/rvmdir/gems
Define RUBY_18 ruby-1.8.7-head
...
SetEnv GEM_HOME ${RVM_ROOT}/${RUBY_18}@typo55
SetEnv GEM_PATH ${RVM_ROOT}/${RUBY_18}@typo55:${RVM_ROOT}/${RUBY_18}@global
答案3
您可以使用以下方式启用或禁用配置位如果定义但这可能达不到你想要的效果。相反,你可以在 Apache init 脚本中设置环境变量以在配置中访问。例如,添加:
HOSTNAME=$(hostname)
在RHEL 机器上/etc/init.d/httpd
(在调用httpd
! 的行之前)将机器的主机名作为变量传递。它不必是命令的输出——任何在启动的环境中设置变量的东西都httpd
可以。变量可以在配置中使用,如下所示:
[root@dev ~]# cat /etc/httpd/conf.d/test.conf
Header set X-Hostname ${HOSTNAME}
[root@dev ~]# GET -Sed http://localhost
GET http://localhost --> 200 OK
Connection: close
Date: Fri, 11 Sep 2009 20:47:13 GMT
Server: Apache/2.2.3 (Red Hat)
Content-Length: 525
Content-Type: text/html;charset=ISO-8859-1
Client-Date: Fri, 11 Sep 2009 20:47:13 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1
Title: Index of /
X-Hostname: dev.local
当然,你不受Header
指令的限制。变量可以在任何地方使用,例如<Directory ${FOO}>
etc。
如果你不喜欢这个(而且它不是那么好...)你可以使用模板生成配置米4或其他模板语言。
额外的:
嗯,一种更好的方法是将所有变量存储在外部文件中,也许/etc/httpd/conf/variables.txt
:
FOO=/path/to/dir
ROLE=development
然后将它们包含到你的 Apacheinit.d
脚本中:
. /etc/httpd/conf/variables
在调用之前httpd
。虽然不是很出色,但至少它将启动脚本和变量分开了。
答案4
我遇到了同样的问题,经过一番研究,Apache 2.x 的解决方案确切地为我解决了这个问题(仅此而已)是这样的:
http://people.apache.org/~rjung/mod_define/
请注意,解压后您应该像这样构建它(文档的安装部分似乎忘记遵守 apache2?):
apxs2 -cia mod_define.c
然后创建/etc/apache2/mods-available/define.load
:
LoadModule define_module /usr/lib/apache2/modules/mod_define.so
此后,a2enmod
像平常一样启用该模块。
上面链接中的文档展示了如何使用它。现在您可以非常简单地定义内容并直接使用它,所有这些都在同一个 apache2 配置中完成。