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与通过-D或Define设置的variables不同 – 它们是完全独立的每个请求上下文(这些是您使用SetEnvIf设置的上下文),只有特定的指令才会使用。 他们被特别提到支持的地方 – 在mod_rewrite他们是%{ENV:variable} ,在日志里他们是%{variable}e ,很多指令都有一个逻辑检查,看起来像env=variable 。
所以基本上 这是一个混乱的混乱 – 在过去几十年的web服务器的历史certificate。 可能让您感到困惑的主要原因是mod_rewrite的语法没有以任何方式扩展到configuration的任何其他部分; 这是完全不同的。 从这一点来看,主要的一点是,没有一个统治的“规则”使所有这一切都变得有意义 – 一个地方的$与另一个地方的$完全不同。
几个方便的参考点:
Define和${VAR}replace一次。 当你想要在开发环境和生产环境之间进行共享configuration文件时,这个function是非常有用的,但是不要把RewriteMap中总是包含$混在一起使用。 %{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时插值。