是否可以在 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
Run Code Online (Sandbox Code Playgroud)
而且我想将 '/path/to/foo' 变成一个变量,所以它只需要在一个地方定义。就像是:
Variable FOO /path/to/foo
…
Run Code Online (Sandbox Code Playgroud)
谢谢!
Gra*_*ton 70
您可以使用mod_macro,它自2.4 版以来已包含在 Apache httpd 中
在此之前,它必须单独安装,请参阅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>
Run Code Online (Sandbox Code Playgroud)
/etc/apache2/sites-available/vhost.mysite.com
Use VHost vhost.mysite.com 80
Run Code Online (Sandbox Code Playgroud)
小智 31
使用Define关键字更简单。请参阅定义指令。
Define RVM_ROOT /opt/rvmdir/gems
Define RUBY_18 ruby-1.8.7-head
Run Code Online (Sandbox Code Playgroud)
...
SetEnv GEM_HOME ${RVM_ROOT}/${RUBY_18}@typo55
SetEnv GEM_PATH ${RVM_ROOT}/${RUBY_18}@typo55:${RVM_ROOT}/${RUBY_18}@global
Run Code Online (Sandbox Code Playgroud)
mar*_*ton 14
您可以使用IfDefine启用或禁用一些配置,但这可能不会满足您的需求。相反,您可以在 Apache init 脚本中设置环境变量以在配置中访问。例如,添加:
HOSTNAME=$(hostname)
Run Code Online (Sandbox Code Playgroud)
RHEL 机器上的to /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
Run Code Online (Sandbox Code Playgroud)
当然,您并不仅限于该Header指令。变量可以在任何地方使用,例如<Directory ${FOO}>等。
如果您不喜欢这个(而且它不是那么好..),您可以使用m4或其他一些模板语言从模板生成配置。
附加:
Hrm,一种更好的方法是将所有变量存储在一个外部文件中,也许/etc/httpd/conf/variables.txt:
FOO=/path/to/dir
ROLE=development
Run Code Online (Sandbox Code Playgroud)
然后将这些包含到您的 Apacheinit.d脚本中:
. /etc/httpd/conf/variables
Run Code Online (Sandbox Code Playgroud)
在打电话之前httpd。仍然不是很出色,但至少它将启动脚本和变量分开了。
您可以将系统环境变量与 mod_env 和 PassEnv 指令一起使用。 看这里
Debian 示例:
将您的变量添加到 /etc/apache2/envvars (apache2ctl 使用此文件来定义变量)
...
export APACHE_PID_FILE=/var/run/apache2.pid
export HOSTNAME=$(hostname)
Run Code Online (Sandbox Code Playgroud)
将您的变量传递给 apache 配置
PassEnv HOSTNAME
Run Code Online (Sandbox Code Playgroud)
然后,您可以像访问 apache 变量一样访问系统环境变量。
Header set Served-By %{HOSTNAME}e
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101413 次 |
| 最近记录: |