httpd.confvariables:$ {var}和%{var}之间有什么区别?

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

如何以及何时使用${}%{}

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

可以使用$ {VAR}语法在configuration文件行中使用Define of或shell环境variables定义的variables值。

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

服务器variables:这些variables的forms为%{NAME_OF_VARIABLE}

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

除了在mod_rewrite指令(像RewriteCond,RewriteRule, RewriteRule ^ / ex /(.*)$ {examplemap:$ 1} )中使用${} RewriteMap扩展外, $ {VAR}

使用SetEnvIf指令在httpd.conf中设置的variables是否将用作${var}除非variables与mod_rewrite指令一起使用,variables将用作%{var}

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

几乎所有的东西。 没有硬性的规定,说“ $ x,xx,y”,因为他们做不同的事情取决于他们在哪里和如何使用。

在httpd.conf中,除了mod_rewrite指令之外,$ {VAR}会被用到

否 – ${VAR}作为整个configuration中每个位置的replace,即使在mod_rewrite相关行中也是如此。 这些只能在启动时使用传递给httpd二进制文件的-D选项或Define指令来Define

可以这样做,因为这些variables不能包含:字符,而RewriteMap用法必须包含:字符。 这允许以非常不同的方式使用$而不发生冲突 – parsing器看到:并知道它不应该被replace。

使用SetEnvIf指令在httpd.conf中设置的variables是否将用作$ {var},除非variables与mod_rewrite指令一起使用,variables将用作%{var}?

不可以。环境variables与通过-DDefine设置的variables不同 – 它们是完全独立的每个请求上下文(这些是您使用SetEnvIf设置的上下文),只有特定的指令才会使用。 他们被特别提到支持的地方 – 在mod_rewrite他们是%{ENV:variable} ,在日志里他们是%{variable}e ,很多指令都有一个逻辑检查,看起来像env=variable


所以基本上 这是一个混乱的混乱 – 在过去几十年的web服务器的历史certificate。 可能让您感到困惑的主要原因是mod_rewrite的语法没有以任何方式扩展到configuration的任何其他部分; 这是完全不同的。 从这一点来看,主要的一点是,没有一个统治的“规则”使所有这一切都变得有意义 – 一个地方的$与另一个地方的$完全不同。

几个方便的参考点:

  1. 如果您希望在Apache启动时静态设置variables,请在Apache启动时使用Define${VAR}replace一次。 当你想要在开发环境和生产环境之间进行共享configuration文件时,这个function是非常有用的,但是不要把RewriteMap中总是包含$混在一起使用。
  2. 如果您正在寻找在特定请求中使用variables,那么环境variables就是您所追求的内容 – 但是您无法对与特定指令一起使用的语法进行假设。 您需要检查该指令的文档。
  3. 当mod_rewrite出现问题时,抛出所有你认为有关variables和语法的知识。 它在%{VAR}有自己的一组variables,可以用%{ENV:VAR}得到'正常'环境variables,并且可以用[E=VAR]设置环境variables。

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

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

所以它看起来像%是确切的variables,而$是用于查找散列表(“地图”)。 而且,所有的mod_rewrite扩展都完全独立于核心 – 在模块本身完成的全部扩展。

我早就想到了,但那是错误的:

$ {}variables是使用项目的环境,并在configurationparsing时进行评估。

%{}variables是使用请求的环境,并在请求parsing时进行评估。 mod_rewrite使用%{}语义来防止由httpd core进行configuration时插值。