htaccess可以读取Apache中设置的服务器环境变量吗?

Tim*_*ahn 12 apache .htaccess webserver

在Apache设置中设置服务器环境变量时,可以使用内置函数从PHP读取该变量.

但是你能从htaccess文件中读取变量吗?

我想要在我的htaccess中实现的目标是:

<If var=="stuff">
do things here
</if>

<if var=="different stuff">
do different things here
</if>
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 7

是的.

您可能希望使用mod_setenvif功能,因此需要打开该模块.

然后你只需做一些事情:

SetEnvIf Request_URI "\.gif$" image_type=gif
Run Code Online (Sandbox Code Playgroud)

如果请求的文件名结束image_type,gif则将环境变量设置为值.gif.

然后你可以像这样访问它(比如在RewriteCond中):

RewriteCond %{ENV:image_type} gif
RewriteRule ^(.*) $.gif
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读完整的文档:http: //httpd.apache.org/docs/2.2/env.html

  • 嗯...问题在于,常规环境变量在请求过程中设置得很晚,并且无法用于.htaccess。您需要使用.htaccess中的SetEnvIf设置值。请参阅此文档链接中的“腔室”部分。http://httpd.apache.org/docs/2.2/env.html (2认同)

小智 6

由于在设置类似的东西来识别我的本地本地主机与我的工作设置不同时遇到很多问题,因此我最终要做的是。

首先,该 <IF ..>指令不能识别SetEnv。来自http://httpd.apache.org/docs/current/env.html:“ SetEnv指令在请求处理期间运行较晚,这意味着诸如SetEnvIf和RewriteCond之类的指令将看不到使用它设置的变量。”

因此,如果可以,请尝试使用SetEnvIf。我很懒,只是把它放在我的httpd.conf文件中。它检查它是否在localhost上运行-显然是localhost-然后设置变量:

SetEnvIf Server_Addr ^127\.0\.0\.1$ home_variable
Run Code Online (Sandbox Code Playgroud)

然后,在其他地方,在我的htaccess文件中,我有以下内容:

# IfVersion needs mod_version - you could do an ifmodule before all this i guess
# we use ifversion because If was introduced in apache 2.4
<IfVersion >= 2.4>
  # check if the home variable exists/isn't: empty, "0", "off", "false", or "no"
  <If "-T reqenv('home_variable')">
    ... do home-y stuff
  </If>

  <Else>
    ... do work-y stuff
  </Else>
</IfVersion>

# fallback
<IfVersion < 2.4>
  .. fallback?
</IfVersion>
Run Code Online (Sandbox Code Playgroud)

或者,您可以为每个环境仅设置一个变量,并为其指定一个特定值:

SetEnvIf Server_Addr ^127\.0\.0\.1$ check_location=home
Run Code Online (Sandbox Code Playgroud)

那么其余的将是相同的,除了第一条<If ..>语句:

<If "%{ENV:check_location} == 'home'">....</If>
Run Code Online (Sandbox Code Playgroud)

我已经在带有2.4的家庭环境和带有2.2的工作环境之间进行了测试,这两个都启用了mod_version(因此,不用担心ifmod)。

(我也没有针对两个以上的环境进行测试,但是Apache 2.4确实提供了<ElseIf>一个选项,因此也是一种选择)。

Doop di do。

(有关-T运算符的更多信息,请参见http://httpd.apache.org/docs/current/expr.html