在 Apache (Windows) DocumentRoot 中使用 setenv

在 Apache (Windows) DocumentRoot 中使用 setenv

堆栈尝试将配置从 Linux 迁移到 Windows Apache 2.2(通过 WAMP)

我们正在尝试设置一个 ENV Apache 变量作为 DocumentRoot 以及随后的其余指令,以便我们可以在服务器和开发人员的本地工作副本上使用同一组配置。

在 Debian Linux Apache 中,我们有一个包含“EXPORT”指令的 envvars 文件。这在 Windows 上不起作用,但是

Setenv ROOT_TO_FILES "C:/wamp/www/test"

似乎可以像 phpinfo() 所显示的那样工作

但是当我们在 vhost 的 DocumentRoot 指令中使用它时:

DocumentRoot ${ROOT_TO_FILES} 

Apache 在其自己的根目录下查找该文字文本。

这是我们在 Linux 中使用的方式,但我们也尝试了 env=ROOT_TO_FILES 的语法

Apache 文档似乎清楚地说明了如何“定义”,但没有说明如何使用。我还看到 Apache 2.4 包含一个新的“Define”指令,它似乎正是这样做的,这让我认为在以前的版本中可能不可能实现。

任何在 Windows Apache 下使用的示例都将受到欢迎。

答案1

Apache 的SetEnv指令只是定义了 PHP 或 Perl 脚本可以使用的变量,例如它们出现在 PHP 的$_SERVER[]全局数组中。

SetEnv以及它的同类,都与 Apache 指令中的变量的使用无关。

http://httpd.apache.org/docs/current/mod/mod_env.html#setenv

DocumentRoot 通常需要一个文字字符串...

您要做的是使用 mod_macro (包含在 Apache 2.4.5 中 / *在此之前,您可以找到它作为额外模块进行下载)... http://httpd.apache.org/docs/current/mod/mod_macro.html

*对于 Apache 2.2,请在 Google 上搜索 mod_macro Apache 2.2 VC9。TS/Thread-safe 适用于 mod_php,NTS/Non-Thread-Safe 适用于 PHP-FCGI。

答案2

即使在 Windows Apache 中也可以使用 Env 变量,例如我使用此代码来设置我的服务器名称:

ServerName "${COMPUTERNAME}:80"

但是,如果环境变量是在启动服务器之前定义的,则您只能以这种方式使用环境变量,并且不能通过 SetEnv 进行更改。

如果你喜欢使用 ${ROOT_TO_FILES} 来像在 Linux 中那样,你可以

  1. 创建 ROOT_TO_FILES 作为系统范围的环境变量
  2. 从命令行或者批处理文件启动 apache

这是一个例子:(如果不同,请输入 httpd.exe 的路径)

 set ROOT_TO_FILES=C:/wamp/www/test
 %ProgramFiles%\xampp\apache\bin\httpd

这在 apache 2.2 和 2.4 中进行了测试。

如果您愿意,您甚至可以使用 apache.con 中通过 SetEnv 声明的变量,例如:

SetEnv MY_VHOST "example.com"
Header set X-Vhost %{MY_VHOST}e 

## this will add your own variable to this logformat
LogFormat "%h %l %{MY_VHOST}e %t \"%r\" %>s %b" common_myvhost
CustomLog log/access.log common_myvhost

但是您需要知道,SetEnv 设置的变量对于“早期”部分(如访问控制)来说是不可访问的。

查看文档http://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv 如果你需要更多关于 SetEnv (或 SetEnvIf )的信息

相关内容