<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
<!-- $LastChangedRevision$ -->

<!--
 Copyright 2002-2005 The Apache Software Foundation or its licensors, as
 applicable.

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<modulesynopsis metafile="mod_setenvif.xml.meta">

<name>mod_setenvif</name>
<description>Allows the setting of environment variables based
on characteristics of the request</description>
<status>Base</status>
<sourcefile>mod_setenvif.c</sourcefile>
<identifier>setenvif_module</identifier>


<summary>

    <p>The <module>mod_setenvif</module> module allows you to set
    environment variables according to whether different aspects of
    the request match regular expressions you specify. These
    environment variables can be used by other parts of the server
    to make decisions about actions to be taken.</p>

    <p>The directives are considered in the order they appear in
    the configuration files. So more complex sequences can be used,
    such as this example, which sets <code>netscape</code> if the
    browser is mozilla but not MSIE.</p>

<example>
  BrowserMatch ^Mozilla netscape<br />
  BrowserMatch MSIE !netscape<br />
</example>
</summary>

<seealso><a href="../env.html">Environment Variables in Apache</a></seealso>

<directivesynopsis>
<name>BrowserMatch</name>
<description>Sets environment variables conditional on HTTP User-Agent
</description>
<syntax>BrowserMatch <em>regex [!]env-variable</em>[=<em>value</em>]
[[!]<em>env-variable</em>[=<em>value</em>]] ...</syntax>
<contextlist><context>server config</context>
<context>virtual host</context><context>directory</context>
<context>.htaccess</context></contextlist>
<override>FileInfo</override>

<usage>
  <p>The <directive>BrowserMatch</directive> is a special cases of the
  <directive module="mod_setenvif">SetEnvIf</directive> directive that
  sets environment variables conditional on the
  <code>User-Agent</code> HTTP request header.  The following two
  lines have the same effect:</p>
<example>
   BrowserMatchNoCase Robot is_a_robot<br /> 
   SetEnvIfNoCase User-Agent Robot is_a_robot<br /> 
</example>

    <p>Some additional examples:</p>
<example>
    BrowserMatch ^Mozilla forms jpeg=yes browser=netscape<br />
    BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript<br />
    BrowserMatch MSIE !javascript<br />
</example>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>BrowserMatchNoCase</name>
<description>Sets environment variables conditional on User-Agent without
respect to case</description>
<syntax>BrowserMatchNoCase  <em>regex [!]env-variable</em>[=<em>value</em>]
    [[!]<em>env-variable</em>[=<em>value</em>]] ...</syntax>
<contextlist><context>server config</context>
<context>virtual host</context><context>directory</context>
<context>.htaccess</context></contextlist>
<override>FileInfo</override>
<compatibility>Apache 1.2 and
    above (in Apache 1.2 this directive was found in the
    now-obsolete mod_browser module)</compatibility>

<usage>

    <p>The <directive>BrowserMatchNoCase</directive> directive is
    semantically identical to the <directive
    module="mod_setenvif">BrowserMatch</directive> directive.
    However, it provides for case-insensitive matching. For
    example:</p>
<example>
    BrowserMatchNoCase mac platform=macintosh<br />
    BrowserMatchNoCase win platform=windows<br />
</example>

    <p>The <directive>BrowserMatch</directive> and
    <directive>BrowserMatchNoCase</directive> directives are special cases of
    the <directive module="mod_setenvif">SetEnvIf</directive> and <directive
    module="mod_setenvif">SetEnvIfNoCase</directive>
    directives. The following two lines have the same effect:</p>
<example>
   BrowserMatchNoCase Robot is_a_robot<br />
   SetEnvIfNoCase User-Agent Robot is_a_robot<br />
</example>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>SetEnvIf</name>
<description>Sets environment variables based on attributes of the request
</description>
<syntax>SetEnvIf <em>attribute
    regex [!]env-variable</em>[=<em>value</em>]
    [[!]<em>env-variable</em>[=<em>value</em>]] ...</syntax>
<contextlist><context>server config</context>
<context>virtual host</context><context>directory</context>
<context>.htaccess</context></contextlist>
<override>FileInfo</override>

<usage>
    <p>The <directive>SetEnvIf</directive> directive defines
    environment variables based on attributes of the request. The
    <em>attribute</em> specified in the first argument can be one of four
    things:</p>

<ol>
<li>An HTTP request header field (see <a
    href="http://www.rfc-editor.org/rfc/rfc2616.txt">RFC2616</a>
    for more information about these); for example: <code>Host</code>,
    <code>User-Agent</code>, <code>Referer</code>, and 
    <code>Accept-Language</code>.  A regular expression may be
    used to specify a set of request headers.</li>

<li>One of the following aspects of the request:
    <ul>
      <li><code>Remote_Host</code> - the hostname (if available) of
      the client making the request</li>

      <li><code>Remote_Addr</code> - the IP address of the client
      making the request</li>

      <li><code>Server_Addr</code> - the IP address of the server
      on which the request was received (only with versions later
      than 2.0.43)</li>

      <li><code>Request_Method</code> - the name of the method
      being used (<code>GET</code>, <code>POST</code>, <em>et
      cetera</em>)</li>

      <li><code>Request_Protocol</code> - the name and version of
      the protocol with which the request was made (<em>e.g.</em>,
      "HTTP/0.9", "HTTP/1.1", <em>etc.</em>)</li>

      <li><code>Request_URI</code> - the resource requested on the HTTP
       request line -- generally the portion of the URL
      following the scheme and host portion without the query string</li>
    </ul>
</li>

<li>The name of an environment variable in the list of those
associated with the request. This allows
<directive>SetEnvIf</directive> directives to test against the result
of prior matches. Only those environment variables defined by earlier
<code>SetEnvIf[NoCase]</code> directives are available for testing in
this manner. 'Earlier' means that they were defined at a broader scope
(such as server-wide) or previously in the current directive's scope.
Environment variables will be considered only if there was no match
among request characteristics and a regular expression was not
used for the <em>attribute</em>.</li>

<li>
 A reference to an extension of an SSL client certificate, located by
 its object id <em>oid</em>.
 If a non-SSL request, or in absense of the configured <em>oid</em>,
 no variable will be set. If the <em>oid</em> is found multiple times,
 the individual strings will be concatenated, separated by a comma <code>','</code>.
 The <em>oid</em> should reference a string-valued extension.
</li>
</ol>

<p>The second argument (<em>regex</em>) is a <glossary
ref="regex">regular expression</glossary>.  If the <em>regex</em>
matches against the <em>attribute</em>, then the remainder of the
arguments are evaluated.</p>

<p>The rest of the arguments give the names of variables to set, and
optionally values to which they should be set. These take the form
of</p>

    <ol>
      <li><code><em>varname</em></code>, or</li>

      <li><code>!<em>varname</em></code>, or</li>

      <li><code><em>varname</em>=<em>value</em></code></li>
    </ol>

    <p>In the first form, the value will be set to "1". The second
    will remove the given variable if already defined, and the
    third will set the variable to the literal value given by
    <code><em>value</em></code>. Since version 2.0.51 Apache will
    recognize occurrences of <code>$1</code>..<code>$9</code> within
    <var>value</var> and replace them by parenthesized subexpressions
    of <var>regex</var>.</p>

<example>
<title>Example:</title>
   SetEnvIf Request_URI "\.gif$" object_is_image=gif<br />
   SetEnvIf Request_URI "\.jpg$" object_is_image=jpg<br />
   SetEnvIf Request_URI "\.xbm$" object_is_image=xbm<br />
        :<br />
   SetEnvIf Referer www\.mydomain\.com intra_site_referral<br />
        :<br />
   SetEnvIf object_is_image xbm XBIT_PROCESSING=1<br />
        :<br />
   SetEnvIf OID("2.16.840.1.113730.1.13") "(.*)" NetscapeComment=$1<br />
        :<br />
   SetEnvIf ^TS*  ^[a-z].*  HAVE_TS<br />
</example>

    <p>The first three will set the environment variable
    <code>object_is_image</code> if the request was for an image
    file, and the fourth sets <code>intra_site_referral</code> if
    the referring page was somewhere on the
    <code>www.mydomain.com</code> Web site.</p>

    <p>The sixth example will set the <code>NetscapeComment</code>
    environment variable to the string found in the corresponding
    SSL client certificate field (if found).</p>

    <p>The last example will set environment variable
    <code>HAVE_TS</code> if the request contains any headers that
    begin with "TS" whose values begins with any character in the
    set [a-z].</p>
</usage>

<seealso><a href="../env.html">Environment Variables in Apache</a>,
for additional examples.
</seealso>
</directivesynopsis>

<directivesynopsis>
<name>SetEnvIfNoCase</name>
<description>Sets environment variables based on attributes of the request
without respect to case</description>
<syntax>SetEnvIfNoCase <em>attribute regex 
        [!]env-variable</em>[=<em>value</em>]
    [[!]<em>env-variable</em>[=<em>value</em>]] ...</syntax>
<contextlist><context>server config</context>
<context>virtual host</context><context>directory</context>
<context>.htaccess</context></contextlist>
<override>FileInfo</override>
<compatibility>Apache 1.3 and above</compatibility>

<usage>

    <p>The <directive>SetEnvIfNoCase</directive> is semantically identical to
    the <directive module="mod_setenvif">SetEnvIf</directive> directive,
    and differs only in that the regular expression matching is
    performed in a case-insensitive manner. For example:</p>
<example>
   SetEnvIfNoCase Host Apache\.Org site=apache
</example>

    <p>This will cause the <code>site</code> environment variable
    to be set to "<code>apache</code>" if the HTTP request header
    field <code>Host:</code> was included and contained
    <code>Apache.Org</code>, <code>apache.org</code>, or any other
    combination.</p>
</usage>
</directivesynopsis>
</modulesynopsis>
