httpd.conf变量:$ {var}和%{var}有什么区别?


7

${var}%{var}httpd.conf 和有什么不一样?

如何以及何时将一个使用${}%{}

http://httpd.apache.org/docs/2.4/configuring.html提到:

可以使用$ {VAR}语法在配置文件行中使用通过Define of或Shell环境变量定义的变量值。

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html提到:

服务器变量:这些变量的格式为%{NAME_OF_VARIABLE}

RewriteMap扩展:这些是$ {mapname:key | default}形式的扩展。

${VAR}在httpd.conf中的任何地方使用,除了在mod_rewrite指令中(例如RewriteCond,RewriteRule,但在RewriteMap扩展中除外,该扩展${}RewriteRule ^ / ex /(.*)$ {examplemap:$ 1}中使用

是否会在httpd.conf中使用SetEnvIf指令设置${var}的变量(与在同一httpd.conf中使用的变量相同)用于,除非该变量与mod_rewrite指令一起使用时,该变量将用作变量%{var}

Answers:


5

httpd.conf中的$ {var}和%{var}有什么区别?

几乎所有的东西。没有严格的规则说“ $做x,%做y”,因为它们根据使用位置和使用方式来做不同的事情。

$ {VAR}将在httpd.conf中的任何地方使用,但mod_rewrite指令的

否- ${VAR}在整个配置中的每个位置(即使在与m​​od_rewrite相关的行中)将用作替换。这些只能在启动时使用-D传递给httpd二进制文件的选项或Define指令进行定义。

之所以可以这样做,是因为这些变量必须不包含:字符,而RewriteMap用法必须包含:字符。这样就可以$以完全不同的方式使用,而不会发生冲突-解析器可以看到,:并且知道不应替换它。

是否可以将使用SetEnvIf指令在httpd.conf中设置的变量(与同一httpd.conf一起使用)用作$ {var},除非该变量与mod_rewrite指令一起使用(该变量将用作%{var})?

否。环境变量与通过-D或设置的变量不同Define-它们是完全独立的每个请求上下文(这些是您使用设置的上下文SetEnvIf),只有某些指令会使用。特别提到了它们的支持位置-在mod_rewrite中%{ENV:variable},在日志中%{variable}e,并且许多指令的逻辑检查如下所示env=variable


因此,基本上 这是一个混乱的混乱局面-证明了过去二十年来Web服务器的历史。可能使您感到困惑的主要事情是,mod_rewrite的语法没有以任何方式扩展到配置的任何其他部分。都是不同的。从所有这一切中得出的主要观点是,没有一个使所有这些都变得有意义的统治“规则”- $一个地方的意思是与$另一个地方的事情完全不同。

一些方便的参考点:

  1. 如果要在Apache启动时静态设置变量,请在Apache启动时使用Define${VAR}替换一次。当您想在开发环境和生产环境之间执行诸如共享配置文件之类的操作时,这尤其有用-但不要与$from 一起使用RewriteMap,后者总是包含一个:
  2. 如果要在特定请求中使用变量,那么环境变量就是您要追求的目标-但是您无法对与特定指令一起使用时将要使用的语法做出假设。您需要查看该指令的文档。
  3. 当对mod_rewrite提出疑问时,请抛弃所有您认为有关变量及其语法的知识。它具有自己的一组变量%{VAR},您可以使用来获取“正常”环境变量%{ENV:VAR},并可以使用来设置环境变量[E=VAR]

哇!感谢您的冗长撰写!我要花一些时间来消化这个。Apache文档没有在一个地方记录这一点,这很奇怪,这对于许多新手来说一定是很困惑的。
X10 2012年

是的-他们的文档对于特定的概念还不错,但是像这样的“大图片”东西还不清楚。
Shane Madden

1

我查看了mod_rewrite的源代码,发现注释中有注释(do_expand函数):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

因此看起来就像%用于精确变量,而$用于哈希表(“映射”)中的查找。同样,所有mod_rewrite扩展都完全独立于核心-整个扩展本身都是在模块中完成的。

我早先被认为是,但这是错误的:

$ {} vars是项目的使用环境,并在配置解析时进行评估。

%{} vars是使用请求的环境,并在请求解析时进行评估。mod_rewrite使用%{}来防止使用httpd内核进行配置时插值。


谢谢,能否请您提供指向原始文档的链接,并在可能的情况下链接至教程?
X10 2012年

我从未在文档中以明文形式看到过这一点。这就是我所理解的原因。那是错误的:)
datacompboy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.