AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 64656
Accepted
David Wolever
David Wolever
Asked: 2009-09-12 12:33:30 +0800 CST2009-09-12 12:33:30 +0800 CST 2009-09-12 12:33:30 +0800 CST

在 Apache 配置文件中使用变量来减少重复?

  • 772

是否可以在 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
…

谢谢!

apache-2.2
  • 7 7 个回答
  • 107273 Views

7 个回答

  • Voted
  1. Best Answer
    Graham Dumpleton
    2009-09-12T23:12:05+08:002009-09-12T23:12:05+08:00

    您可以使用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>
    

    /etc/apache2/sites-available/vhost.mysite.com

    Use VHost vhost.mysite.com 80
    
    • 72
  2. Mathieu J.
    2015-06-01T17:47:32+08:002015-06-01T17:47:32+08:00

    使用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
    
    • 34
  3. markdrayton
    2009-09-12T12:54:09+08:002009-09-12T12:54:09+08:00

    您可以使用IfDefine启用或禁用配置位,但这可能不会满足您的要求。相反,您可以在 Apache 初始化脚本中设置环境变量以在配置中访问。例如,添加:

    HOSTNAME=$(hostname)
    

    to /etc/init.d/httpd(在调用httpd! 的行之前)在 RHEL 机器上将机器的主机名作为变量传递。它不一定是命令的输出——在启动的环境中设置变量的任何东西都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}>等。

    如果您不喜欢这个(而且它不是那么好..),您可以使用m4或其他模板语言从模板生成配置。

    附加:

    Hrm,使其更好的一种方法是将所有变量存储在外部文件中,也许/etc/httpd/conf/variables.txt:

    FOO=/path/to/dir
    ROLE=development
    

    然后将这些包含到您的 Apacheinit.d脚本中:

    . /etc/httpd/conf/variables
    

    打电话之前httpd。仍然不是很出色,但至少它将启动脚本和变量分开。

    • 14
  4. Hadrien
    2010-11-11T02:05:17+08:002010-11-11T02:05:17+08:00

    您可以将系统环境变量与 mod_env 和 PassEnv 指令一起使用。 看这里

    Debian 示例:

    将你的变量添加到 /etc/apache2/envvars (这个文件被 apache2ctl 用来定义变量)

    ...
    export APACHE_PID_FILE=/var/run/apache2.pid
    export HOSTNAME=$(hostname)
    

    将您的变量传递到 apache 配置中

    PassEnv HOSTNAME
    

    然后,您可以访问系统环境变量,就像它是 apache 变量一样。

    Header set Served-By %{HOSTNAME}e
    
    • 8
  5. Geradeausanwalt
    2011-01-25T08:39:02+08:002011-01-25T08:39:02+08:00

    我遇到了同样的问题,经过一些研究,完全为我解决了它的 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 配置中。

    • 3
  6. danday74
    2016-04-15T06:25:07+08:002016-04-15T06:25:07+08:00

    令人难以置信,但在 centos 6.4 上的 httpd 2.2 上这有效

    在 /etc/sysconfig/httpd 中导出环境变量

    export mydocroot=/var/www/html
    

    然后只需执行此操作...

    <VirtualHost *:80>
      DocumentRoot ${mydocroot}
    </VirtualHost>
    

    然后终于....

    service httpd restart;
    
    • 2
  7. hurikhan77
    2009-09-12T14:03:09+08:002009-09-12T14:03:09+08:00

    您可能想查看mod_passenger for apache,它也可以托管 django 应用程序。我们使用它取得了巨大的成功。您在虚拟主机中需要做的就是,嗯,什么都没有。您唯一需要做的就是在应用程序根目录中创建一个“公共”目录,并在“公共”中创建指向您的静态目录(如“媒体”)的符号链接(这将提高静态服务性能)并将您的 DocumentRoot 指向它。

    然后将以下文件放在“public/../passenger_wsgi.py”中:

    import sys, os
    current_dir = os.path.dirname(os.path.abspath(__file__))
    sys.path.append(current_dir)
    sys.path.append('/PATH/TO/PACKAGES') # optional
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
    import django.core.handlers.wsgi
    application = django.core.handlers.wsgi.WSGIHandler()
    

    启动您的浏览器:它有效!

    • 1

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve