<?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_dir.xml.meta">
<name>mod_dir</name>
<description>Provides for "trailing slash" redirects and
    serving directory index files</description>
<status>Base</status>
<sourcefile>mod_dir.c</sourcefile>
<identifier>dir_module</identifier>

<summary>
    <p>The index of a directory can come from one of two sources:</p>

    <ul>
      <li>A file written by the user, typically called
      <code>index.html</code>. The <directive module="mod_dir"
      >DirectoryIndex</directive> directive sets the
      name of this file. This is controlled by
      <module>mod_dir</module>.</li>

      <li>Otherwise, a listing generated by the server. This is
      provided by <module>mod_autoindex</module>.</li>
    </ul>
    <p>The two functions are separated so that you can completely
    remove (or replace) automatic index generation should you want
    to.</p> 

    <p>A "trailing slash" redirect is issued when the server
    receives a request for a URL
    <code>http://servername/foo/dirname</code> where
    <code>dirname</code> is a directory. Directories require a
    trailing slash, so <module>mod_dir</module> issues a redirect to
    <code>http://servername/foo/dirname/</code>.</p>
</summary>

<directivesynopsis>
<name>DirectoryIndex</name>
<description>List of resources to look for when the client requests
a directory</description>
<syntax>DirectoryIndex
    <var>local-url</var> [<var>local-url</var>] ...</syntax>
<default>DirectoryIndex index.html</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>Indexes</override>

<usage>
    <p>The <directive>DirectoryIndex</directive> directive sets the
    list of resources to look for, when the client requests an index
    of the directory by specifying a / at the end of the directory
    name.  <var>Local-url</var> is the (%-encoded) URL of a document on
    the server relative to the requested directory; it is usually the
    name of a file in the directory. Several URLs may be given, in
    which case the server will return the first one that it finds.  If
    none of the resources exist and the <code>Indexes</code> option is
    set, the server will generate its own listing of the
    directory.</p>

    <example><title>Example</title>
      DirectoryIndex index.html
    </example>

    <p>then a request for <code>http://myserver/docs/</code> would
    return <code>http://myserver/docs/index.html</code> if it
    exists, or would list the directory if it did not.</p>

    <p>Note that the documents do not need to be relative to the
    directory;</p>

    <example>
      DirectoryIndex index.html index.txt  /cgi-bin/index.pl
    </example>

    <p>would cause the CGI script <code>/cgi-bin/index.pl</code> to be
    executed if neither <code>index.html</code> or <code>index.txt</code>
    existed in a directory.</p>
</usage>
</directivesynopsis>

<directivesynopsis>
<name>DirectorySlash</name>
<description>Toggle trailing slash redirects on or off</description>
<syntax>DirectorySlash On|Off</syntax>
<default>DirectorySlash On</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>Indexes</override>
<compatibility>Available in version 2.0.51 and later</compatibility>

<usage>
    <p>The <directive>DirectorySlash</directive> directive determines, whether
    <module>mod_dir</module> should fixup URLs pointing to a directory or
    not.</p>

    <p>Typically if a user requests a resource without a trailing slash, which
    points to a directory, <module>mod_dir</module> redirects him to the same
    resource, but <em>with</em> trailing slash for some good reasons:</p>

    <ul>
    <li>The user is finally requesting the canonical URL of the resource</li>
    <li><module>mod_autoindex</module> works correctly. Since it doesn't emit
    the path in the link, it would point to the wrong path.</li>
    <li><directive module="mod_dir">DirectoryIndex</directive> will be evaluated
    <em>only</em> for directories requested with trailing slash.</li>
    <li>Relative URL references inside html pages will work correctly.</li>
    </ul>

    <p>Well, if you don't want this effect <em>and</em> the reasons above don't
    apply to you, you can turn off the redirect with:</p>

    <example>
        # see security warning below!<br />
        &lt;Location /some/path&gt;<br />
        <indent>
            DirectorySlash Off<br />
            SetHandler some-handler<br />
        </indent>
        &lt;/Location&gt;
    </example>

    <note type="warning"><title>Security Warning</title>
    <p>Turning off the trailing slash redirect may result in an information
    disclosure. Consider a situation where <module>mod_autoindex</module> is
    active (<code>Options +Indexes</code>) and <directive module="mod_dir"
    >DirectoryIndex</directive> is set to a valid resource (say,
    <code>index.html</code>) and there's no other special handler defined for
    that URL. In this case a request with a trailing slash would show the
    <code>index.html</code> file. <strong>But a request without trailing slash
    would list the directory contents</strong>.</p>
    </note>
</usage>
</directivesynopsis>

</modulesynopsis>
