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

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You 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.
-->

<manualpage metafile="directive-dict.xml.meta">

  <title>Terms Used to Describe Directives</title>

<summary>
    <p>This document describes the terms that are used to describe
    each Apache <a href="directives.html">configuration
    directive</a>.</p>
</summary>
<seealso><a href="../configuring.html">Configuration files</a></seealso>

<section id="Description"><title>Description</title>

<p>A brief description of the purpose of the directive.</p>
</section>

<section id="Syntax"><title>Syntax</title>

    <p>This indicates the format of the directive as it would
    appear in a configuration file. This syntax is extremely
    directive-specific, and is described in detail in the
    directive's definition. Generally, the directive name is
    followed by a series of one or more space-separated arguments.
    If an argument contains a space, the argument must be enclosed
    in double quotes. Optional arguments are enclosed in square
    brackets. Where an argument can take on more than one possible
    value, the possible values are separated by vertical bars "|".
    Literal text is presented in the default font, while
    argument-types for which substitution is necessary are
    <em>emphasized</em>. Directives which can take a variable
    number of arguments will end in "..." indicating that the last
    argument is repeated.</p>

    <p>Directives use a great number of different argument types. A
    few common ones are defined below.</p>

    <dl>
      <dt><em>URL</em></dt>

      <dd>A complete Uniform Resource Locator including a scheme,
      hostname, and optional pathname as in
      <code>http://www.example.com/path/to/file.html</code></dd>

      <dt><em>URL-path</em></dt>

      <dd>The part of a <em>url</em> which follows the scheme and
      hostname as in <code>/path/to/file.html</code>. The
      <em>url-path</em> represents a web-view of a resource, as
      opposed to a file-system view.</dd>

      <dt><em>file-path</em></dt>

      <dd>The path to a file in the local file-system beginning
      with the root directory as in
      <code>/usr/local/apache/htdocs/path/to/file.html</code>.
      Unless otherwise specified, a <em>file-path</em> which does
      not begin with a slash will be treated as relative to the <a
      href="core.html#serverroot">ServerRoot</a>.</dd>

      <dt><em>directory-path</em></dt>

      <dd>The path to a directory in the local file-system
      beginning with the root directory as in
      <code>/usr/local/apache/htdocs/path/to/</code>.</dd>

      <dt><em>filename</em></dt>

      <dd>The name of a file with no accompanying path information
      as in <code>file.html</code>.</dd>

      <dt><em>regex</em></dt>

      <dd>A Perl-compatible <glossary ref="regex">regular
      expression</glossary>. The directive definition will specify what the
      <em>regex</em> is matching against.</dd>

      <dt><em>extension</em></dt>

      <dd>In general, this is the part of the <em>filename</em>
      which follows the last dot. However, Apache recognizes
      multiple filename extensions, so if a <em>filename</em>
      contains more than one dot, each dot-separated part of the
      filename following the first dot is an <em>extension</em>.
      For example, the <em>filename</em> <code>file.html.en</code>
      contains two extensions: <code>.html</code> and
      <code>.en</code>. For Apache directives, you may specify
      <em>extension</em>s with or without the leading dot. In
      addition, <em>extension</em>s are not case sensitive.</dd>

      <dt><em>MIME-type</em></dt>

      <dd>A method of describing the format of a file which
      consists of a major format type and a minor format type,
      separated by a slash as in <code>text/html</code>.</dd>

      <dt><em>env-variable</em></dt>

      <dd>The name of an <a href="../env.html">environment
      variable</a> defined in the Apache configuration process.
      Note this is not necessarily the same as an operating system
      environment variable. See the <a
      href="../env.html">environment variable documentation</a> for
      more details.</dd>
    </dl>
</section>

<section id="Default"><title>Default</title>

    <p>If the directive has a default value (<em>i.e.</em>, if you
    omit it from your configuration entirely, the Apache Web server
    will behave as though you set it to a particular value), it is
    described here. If there is no default value, this section
    should say "<em>None</em>". Note that the default listed here
    is not necessarily the same as the value the directive takes in
    the default httpd.conf distributed with the server.</p>
</section>

<section id="Context"><title>Context</title>

    <p>This indicates where in the server's configuration files the
    directive is legal. It's a comma-separated list of one or more
    of the following values:</p>

    <dl>
      <dt>server config</dt>

      <dd>This means that the directive may be used in the server
      configuration files (<em>e.g.</em>, <code>httpd.conf</code>), but
      <strong>not</strong> within any
      <directive module="core" type="section">VirtualHost</directive>
      or <directive module="core" type="section">Directory</directive>
      containers. It is not allowed in <code>.htaccess</code> files
      at all.</dd>

      <dt>virtual host</dt>

      <dd>This context means that the directive may appear inside
      <directive module="core" type="section">VirtualHost</directive>
      containers in the server
      configuration files.</dd>

      <dt>directory</dt>

      <dd>A directive marked as being valid in this context may be
      used inside <directive module="core"
      type="section">Directory</directive>, <directive type="section"
      module="core">Location</directive>, <directive module="core"
      type="section">Files</directive>, and <directive
      module="mod_proxy" type="section">Proxy</directive> containers
      in the server configuration files, subject to the restrictions
      outlined in <a href="../sections.html">Configuration
      Sections</a>.</dd>

      <dt>.htaccess</dt>

      <dd>If a directive is valid in this context, it means that it
      can appear inside <em>per</em>-directory
      <code>.htaccess</code> files. It may not be processed, though
      depending upon the <a href="#Override"
      >overrides</a> currently active.</dd>
    </dl>

    <p>The directive is <em>only</em> allowed within the designated
    context; if you try to use it elsewhere, you'll get a
    configuration error that will either prevent the server from
    handling requests in that context correctly, or will keep the
    server from operating at all -- <em>i.e.</em>, the server won't
    even start.</p>

    <p>The valid locations for the directive are actually the
    result of a Boolean OR of all of the listed contexts. In other
    words, a directive that is marked as being valid in
    "<code>server config, .htaccess</code>" can be used in the
    <code>httpd.conf</code> file and in <code>.htaccess</code>
    files, but not within any <directive module="core"
    type="section">Directory</directive> or
    <directive module="core" type="section">VirtualHost</directive>
    containers.</p>
</section>

<section id="Override"><title>Override</title>

    <p>This directive attribute indicates which configuration
    override must be active in order for the directive to be
    processed when it appears in a <code>.htaccess</code> file. If
    the directive's <a href="#Context" >context</a>
    doesn't permit it to appear in <code>.htaccess</code> files,
    then no context will be listed.</p>

    <p>Overrides are activated by the <directive
    module="core">AllowOverride</directive> directive, and apply
    to a particular scope (such as a directory) and all
    descendants, unless further modified by other
    <directive module="core">AllowOverride</directive> directives at
    lower levels. The documentation for that directive also lists the
    possible override names available.</p>
</section>

<section id="Status"><title>Status</title>

    <p>This indicates how tightly bound into the Apache Web server
    the directive is; in other words, you may need to recompile the
    server with an enhanced set of modules in order to gain access
    to the directive and its functionality. Possible values for
    this attribute are:</p>

    <dl>
      <dt>Core</dt>

      <dd>If a directive is listed as having "Core" status, that
      means it is part of the innermost portions of the Apache Web
      server, and is always available.</dd>

      <dt>MPM</dt>

      <dd>A directive labeled as having "MPM" status is provided by
      a <a href="../mpm.html">Multi-Processing Module</a>. This
      type of directive will be available if and only if you are
      using one of the MPMs listed on the <a
      href="#Module">Module</a> line of the directive
      definition.</dd>

      <dt>Base</dt>

      <dd>A directive labeled as having "Base" status is supported
      by one of the standard Apache modules which is compiled into
      the server by default, and is therefore normally available
      unless you've taken steps to remove the module from your
      configuration.</dd>

      <dt>Extension</dt>

      <dd>A directive with "Extension" status is provided by one of
      the modules included with the Apache server kit, but the
      module isn't normally compiled into the server. To enable the
      directive and its functionality, you will need to change the
      server build configuration files and re-compile Apache.</dd>

      <dt>Experimental</dt>

      <dd>"Experimental" status indicates that the directive is
      available as part of the Apache kit, but you're on your own
      if you try to use it. The directive is being documented for
      completeness, and is not necessarily supported. The module
      which provides the directive may or may not be compiled in by
      default; check the top of the page which describes the
      directive and its module to see if it remarks on the
      availability.</dd>
    </dl>
</section>

<section id="Module"><title>Module</title>

    <p>This quite simply lists the name of the source module which
    defines the directive.</p>
</section>

<section id="Compatibility"><title>Compatibility</title>

    <p>If the directive wasn't part of the original Apache version
    2 distribution, the version in which it was introduced should
    be listed here.  In addition, if the directive is available
    only on certain platforms, it will be noted here.</p>
</section>

</manualpage>

