mod_unique_id.html.en revision 11235fe555f482044904c555d3725c7d38575bf6
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster This file is generated from xml source: DO NOT EDIT
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<title>mod_unique_id - Apache HTTP Server Version 2.5</title>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" />
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<script src="/style/scripts/prettify.min.js" type="text/javascript">
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<link href="/images/favicon.ico" rel="shortcut icon" /></head>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p class="apache">Apache HTTP Server Version 2.5</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<div class="up"><a href="./"><img title="<-" alt="<-" src="/images/left.gif" /></a></div>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.5</a> > <a href="./">Modules</a></div>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<div id="preamble"><h1>Apache Module mod_unique_id</h1>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p><span>Available Languages: </span><a href="/en/mod/mod_unique_id.html" title="English"> en </a> |
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="/fr/mod/mod_unique_id.html" hreflang="fr" rel="alternate" title="Fran�ais"> fr </a> |
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="/ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> |
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="/ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean"> ko </a></p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Provides an environment variable with a unique
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Extension</td></tr>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<tr><th><a href="module-dict.html#ModuleIdentifier">Module�Identifier:</a></th><td>unique_id_module</td></tr>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<tr><th><a href="module-dict.html#SourceFile">Source�File:</a></th><td>mod_unique_id.c</td></tr></table>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>This module provides a magic token for each request which is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster guaranteed to be unique across "all" requests under very
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster specific conditions. The unique identifier is even unique
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster across multiple machines in a properly configured cluster of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster machines. The environment variable <code>UNIQUE_ID</code> is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster set to the identifier for each request. Unique identifiers are
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster useful for various reasons which are beyond the scope of this
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster document.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<div id="quickview"><h3 class="directives">Directives</h3>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p>This module provides no
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster directives.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<li><img alt="" src="/images/down.gif" /> <a href="#theory">Theory</a></li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster</ul><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<h2><a name="theory" id="theory">Theory</a></h2>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>First a brief recap of how the Apache server works on Unix
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster machines. This feature currently isn't supported on Windows NT.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster On Unix machines, Apache creates several children, the children
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster process requests one at a time. Each child can serve multiple
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster requests in its lifetime. For the purpose of this discussion,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the children don't share any data with each other. We'll refer
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster to the children as <dfn>httpd processes</dfn>.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>Your website has one or more machines under your
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster administrative control, together we'll call them a cluster of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster machines. Each machine can possibly run multiple instances of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Apache. All of these collectively are considered "the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster universe", and with certain assumptions we'll show that in this
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster universe we can generate unique identifiers for each request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster without extensive communication between machines in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cluster.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>The machines in your cluster should satisfy these
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster requirements. (Even if you have only one machine you should
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster synchronize its clock with NTP.)</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <li>The machines' times are synchronized via NTP or other
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster network time protocol.</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <li>The machines' hostnames all differ, such that the module
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster can do a hostname lookup on the hostname and receive a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster different IP address for each machine in the cluster.</li>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>As far as operating system assumptions go, we assume that
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pids (process ids) fit in 32-bits. If the operating system uses
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster more than 32-bits for a pid, the fix is trivial but must be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster performed in the code.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>Given those assumptions, at a single point in time we can
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster identify any httpd process on any machine in the cluster from
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster all other httpd processes. The machine's IP address and the pid
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster of the httpd process are sufficient to do this. A httpd process
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster can handle multiple requests simultaneously if you use a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster multi-threaded MPM. In order to identify threads, we use a thread
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster index Apache httpd uses internally. So in order to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster generate unique identifiers for requests we need only
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster distinguish between different points in time.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>To distinguish time we will use a Unix timestamp (seconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster since January 1, 1970 UTC), and a 16-bit counter. The timestamp
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster has only one second granularity, so the counter is used to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster represent up to 65536 values during a single second. The
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster quadruple <em>( ip_addr, pid, time_stamp, counter )</em> is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sufficient to enumerate 65536 requests per second per httpd
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster process. There are issues however with pid reuse over time, and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the counter is used to alleviate this issue.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>When an httpd child is created, the counter is initialized
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster with ( current microseconds divided by 10 ) modulo 65536 (this
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster formula was chosen to eliminate some variance problems with the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster low order bits of the microsecond timers on some systems). When
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster a unique identifier is generated, the time stamp used is the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster time the request arrived at the web server. The counter is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster incremented every time an identifier is generated (and allowed
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster to roll over).</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>The kernel generates a pid for each process as it forks the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster process, and pids are allowed to roll over (they're 16-bits on
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster many Unixes, but newer systems have expanded to 32-bits). So
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster over time the same pid will be reused. However unless it is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster reused within the same second, it does not destroy the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster uniqueness of our quadruple. That is, we assume the system does
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster not spawn 65536 processes in a one second interval (it may even
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster be 32768 processes on some Unixes, but even this isn't likely
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster to happen).</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>Suppose that time repeats itself for some reason. That is,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster suppose that the system's clock is screwed up and it revisits a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster past time (or it is too far forward, is reset correctly, and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster then revisits the future time). In this case we can easily show
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster that we can get pid and time stamp reuse. The choice of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster initializer for the counter is intended to help defeat this.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Note that we really want a random number to initialize the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster counter, but there aren't any readily available numbers on most
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster systems (<em>i.e.</em>, you can't use rand() because you need
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster to seed the generator, and can't seed it with the time because
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster time, at least at one second resolution, has repeated itself).
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster This is not a perfect defense.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>How good a defense is it? Suppose that one of your machines
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serves at most 500 requests per second (which is a very
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster reasonable upper bound at this writing, because systems
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster generally do more than just shovel out static files). To do
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster that it will require a number of children which depends on how
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster many concurrent clients you have. But we'll be pessimistic and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster suppose that a single child is able to serve 500 requests per
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster second. There are 1000 possible starting counter values such
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster that two sequences of 500 requests overlap. So there is a 1.5%
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster chance that if time (at one second resolution) repeats itself
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster this child will repeat a counter value, and uniqueness will be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster broken. This was a very pessimistic example, and with real
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster world values it's even less likely to occur. If your system is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster such that it's still likely to occur, then perhaps you should
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster make the counter 32 bits (by editing the code).</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>You may be concerned about the clock being "set back" during
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster summer daylight savings. However this isn't an issue because
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the times used here are UTC, which "always" go forward. Note
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster that x86 based Unixes may need proper configuration for this to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster be true -- they should be configured to assume that the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster motherboard clock is on UTC and compensate appropriately. But
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster even still, if you're running NTP then your UTC time will be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster correct very shortly after reboot.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>The <code>UNIQUE_ID</code> environment variable is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster constructed by encoding the 144-bit (32-bit IP address, 32 bit
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pid, 32 bit time stamp, 16 bit counter, 32 bit thread index)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster quadruple using the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster alphabet <code>[A-Za-z0-9@-]</code> in a manner similar to MIME
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster base64 encoding, producing 24 characters. The MIME base64
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster alphabet is actually <code>[A-Za-z0-9+/]</code> however
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <code>+</code> and <code>/</code> need to be specially encoded
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster in URLs, which makes them less desirable. All values are
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster encoded in network byte ordering so that the encoding is
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster comparable across architectures of different byte ordering. The
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster actual ordering of the encoding is: time stamp, IP address,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pid, counter. This ordering has a purpose, but it should be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster emphasized that applications should not dissect the encoding.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Applications should treat the entire encoded
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <code>UNIQUE_ID</code> as an opaque token, which can be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster compared against other <code>UNIQUE_ID</code>s for equality
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>The ordering was chosen such that it's possible to change
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the encoding in the future without worrying about collision
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster with an existing database of <code>UNIQUE_ID</code>s. The new
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster encodings should also keep the time stamp as the first element,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster and can otherwise use the same alphabet and bit length. Since
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the time stamps are essentially an increasing sequence, it's
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster sufficient to have a <em>flag second</em> in which all machines
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster in the cluster stop serving any request, and stop using the old
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster encoding format. Afterwards they can resume requests and begin
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster issuing the new encodings.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster <p>This we believe is a relatively portable solution to this
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster problem. The identifiers
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster generated have essentially an infinite life-time because future
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster identifiers can be made longer as required. Essentially no
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster communication is required between machines in the cluster (only
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NTP synchronization is required, which is low overhead), and no
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster communication between httpd processes is required (the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster communication is implicit in the pid value assigned by the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster kernel). In very specific situations the identifier can be
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster shortened, but more information needs to be assumed (for
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster example the 32-bit IP address is overkill for any site, but
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster there is no portable shorter replacement for it). </p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p><span>Available Languages: </span><a href="/en/mod/mod_unique_id.html" title="English"> en </a> |
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="/fr/mod/mod_unique_id.html" hreflang="fr" rel="alternate" title="Fran�ais"> fr </a> |
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="/ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese"> ja </a> |
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<a href="/ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean"> ko </a></p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster</div><div class="top"><a href="#page-header"><img src="/images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<script type="text/javascript"><!--//--><![CDATA[//><!--
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostervar comments_shortname = 'httpd';
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fostervar comments_identifier = 'http://httpd.apache.org/docs/trunk/mod/mod_unique_id.html';
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster(function(w, d) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster d.write('<div id="comments_thread"><\/div>');
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster var s = d.createElement('script');
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster})(window, document);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p class="apache">Copyright 2015 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterif (typeof(prettyPrint) !== 'undefined') {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster prettyPrint();