]> granicus.if.org Git - apache/blobdiff - docs/manual/mod/mod_proxy_ajp.html.en
* Remove trailing whitespace from a bunch of *.xml files
[apache] / docs / manual / mod / mod_proxy_ajp.html.en
index 88b743b20144917f3471246113626bb2ac09aff3..604a39aa9cc99982affa186c27c3e8eb2092f978 100644 (file)
@@ -5,33 +5,36 @@
               This file is generated from xml source: DO NOT EDIT
         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
       -->
-<title>mod_proxy_ajp - Apache HTTP Server</title>
+<title>mod_proxy_ajp - Apache HTTP Server Version 2.5</title>
 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
-<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
+<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" />
+<script src="../style/scripts/prettify.min.js" type="text/javascript">
+</script>
+
 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
 <body>
 <div id="page-header">
-<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
-<p class="apache">Apache HTTP Server Version 2.1</p>
+<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>
+<p class="apache">Apache HTTP Server Version 2.5</p>
 <img alt="" src="../images/feather.gif" /></div>
 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
 <div id="path">
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs-project/">Documentation</a> &gt; <a href="../">Version 2.1</a> &gt; <a href="./">Modules</a></div>
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Modules</a></div>
 <div id="page-content">
 <div id="preamble"><h1>Apache Module mod_proxy_ajp</h1>
 <div class="toplang">
-<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_ajp.html" title="English">&nbsp;en&nbsp;</a></p>
+<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_ajp.html" title="English">&nbsp;en&nbsp;</a> |
+<a href="../ja/mod/mod_proxy_ajp.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a></p>
 </div>
 <table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>AJP support module for
 <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code></td></tr>
 <tr><th><a href="module-dict.html#Status">Status:</a></th><td>Extension</td></tr>
 <tr><th><a href="module-dict.html#ModuleIdentifier">Module Identifier:</a></th><td>proxy_ajp_module</td></tr>
-<tr><th><a href="module-dict.html#SourceFile">Source File:</a></th><td>proxy_ajp.c</td></tr>
-<tr><th><a href="module-dict.html#Compatibility">Compatibility:</a></th><td>Available in version 2.1 and later</td></tr></table>
+<tr><th><a href="module-dict.html#SourceFile">Source File:</a></th><td>mod_proxy_ajp.c</td></tr></table>
 <h3>Summary</h3>
 
-    <p>This module <em>requires</em> the service of <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. It provides support for the 
+    <p>This module <em>requires</em> the service of <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. It provides support for the
     <code>Apache JServ Protocol version 1.3</code> (hereafter
     <em>AJP13</em>).</p>
 
       large.</p>
     </div>
 </div>
-<div id="quickview"><h3 class="directives">Directives</h3>
-<p>This module provides no
-            directives.</p>
-<h3>Topics</h3>
+<div id="quickview"><h3>Topics</h3>
 <ul id="topics">
+<li><img alt="" src="../images/down.gif" /> <a href="#usage">Usage</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#env">Environment Variables</a></li>
 <li><img alt="" src="../images/down.gif" /> <a href="#overviewprotocol">Overview of the protocol</a></li>
 <li><img alt="" src="../images/down.gif" /> <a href="#basppacketstruct">Basic Packet Structure</a></li>
 <li><img alt="" src="../images/down.gif" /> <a href="#rpacetstruct">Request Packet Structure</a></li>
 <li><img alt="" src="../images/down.gif" /> <a href="#resppacketstruct">Response Packet Structure</a></li>
-</ul><h3>See also</h3>
+</ul><h3 class="directives">Directives</h3>
+<p>This module provides no
+            directives.</p>
+<h3>See also</h3>
 <ul class="seealso">
 <li><code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code></li>
-</ul></div>
+<li><a href="../env.html">Environment Variable documentation</a></li>
+</ul><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 <div class="section">
+<h2><a name="usage" id="usage">Usage</a></h2>
+    <p>This module is used to reverse proxy to a backend application server
+    (e.g. Apache Tomcat) using the AJP13 protocol. The usage is similar to
+    an HTTP reverse proxy, but uses the <code>ajp://</code> prefix:</p>
+
+    <div class="example"><h3>Simple Reverse Proxy</h3><pre class="prettyprint lang-config">ProxyPass "/app" "ajp://backend.example.com:8009/app"</pre>
+</div>
+
+    <p>Balancers may also be used:</p>
+    <div class="example"><h3>Balancer Reverse Proxy</h3><pre class="prettyprint lang-config">&lt;Proxy balancer://cluster&gt;
+    BalancerMember ajp://app1.example.com:8009 loadfactor=1
+    BalancerMember ajp://app2.example.com:8009 loadfactor=2
+    ProxySet lbmethod=bytraffic
+&lt;/Proxy&gt;
+ProxyPass "/app" "balancer://cluster/app"</pre>
+</div>
+
+    <p>Note that usually no
+    <code class="directive"><a href="../mod/mod_proxy.html#proxypassreverse">ProxyPassReverse</a></code>
+    directive is necessary. The AJP request includes the original host
+    header given to the proxy, and the application server can be expected
+    to generate self-referential headers relative to this host, so no
+    rewriting is necessary.</p>
+
+    <p>The main exception is when the URL path on the proxy differs from that
+    on the
+    backend. In this case, a redirect header can be rewritten relative to the
+    original host URL (not the backend <code>ajp://</code> URL), for
+    example:</p>
+    <div class="example"><h3>Rewriting Proxied Path</h3><pre class="prettyprint lang-config">ProxyPass "/apps/foo" "ajp://backend.example.com:8009/foo"
+ProxyPassReverse "/apps/foo" "http://www.example.com/foo"</pre>
+</div>
+    <p>However, it is usually better to deploy the application on the backend
+    server at the same path as the proxy rather than to take this approach.
+    </p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="env" id="env">Environment Variables</a></h2>
+    <p>Environment variables whose names have the prefix <code>AJP_</code>
+    are forwarded to the origin server as AJP request attributes
+    (with the AJP_ prefix removed from the name of the key).</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
 <h2><a name="overviewprotocol" id="overviewprotocol">Overview of the protocol</a></h2>
     <p>The <code>AJP13</code> protocol is packet-oriented.  A binary format
     was presumably chosen over the more readable plain text for reasons of
     cause more connections to be open at once.</p>
     <p>Once the web server has opened a connection to the servlet container,
     the connection can be in one of the following states:</p>
-    <p><ul>
+    <ul>
     <li> Idle <br /> No request is being handled over this connection. </li>
-    <li> Assigned <br /> The connecton is handling a specific request.</li>
-    </ul></p>
+    <li> Assigned <br /> The connection is handling a specific request.</li>
+    </ul>
     <p>Once a connection is assigned to handle a particular request, the basic
-    request informaton (e.g. HTTP headers, etc) is sent over the connection in
+    request information (e.g. HTTP headers, etc) is sent over the connection in
     a highly condensed form (e.g. common strings are encoded as integers).
     Details of that format are below in Request Packet Structure. If there is a
     body to the request <code>(content-length &gt; 0)</code>, that is sent in a
     separate packet immediately after.</p>
     <p>At this point, the servlet container is presumably ready to start
     processing the request.  As it does so, it can send the
-    following messages back to the web server:
+    following messages back to the web server:</p>
     <ul>
     <li>SEND_HEADERS <br />Send a set of headers back to the browser.</li>
     <li>SEND_BODY_CHUNK <br />Send a chunk of body data back to the browser.
     been transferred yet.  This is necessary because the packets have a fixed
     maximum size and arbitrary amounts of data can be included the body of a
     request (for uploaded files, for example).  (Note: this is unrelated to
-    HTTP chunked tranfer).</li>
+    HTTP chunked transfer).</li>
     <li>END_RESPONSE <br /> Finish the request-handling cycle.</li>
-    </ul></p>
+    </ul>
     <p>Each message is accompanied by a differently formatted packet of data.
     See Response Packet Structures below for details.</p>
 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 <h2><a name="basppacketstruct" id="basppacketstruct">Basic Packet Structure</a></h2>
     <p>There is a bit of an XDR heritage to this protocol, but it differs
     in lots of ways (no 4 byte alignment, for example).</p>
-    <p>Byte order: I am not clear about the endian-ness of the individual
-    bytes.  I'm guessing the bytes are little-endian, because that's what
-    XDR specifies, and I'm guessing that sys/socket library is magically
-    making that so (on the C side).  If anyone with a better knowledge of
-    socket calls can step in, that would be great.</p>
+    <p>AJP13 uses network byte order for all data types.</p>
     <p>There are four data types in the protocol: bytes, booleans,
-    integers and strings.
+    integers and strings.</p>
     <dl>
     <dt><strong>Byte</strong></dt><dd>A single byte.</dd>
     <dt><strong>Boolean</strong></dt>
       C code can pass around references into a single buffer, without copying.
       if the \0 was missing, the C code would have to copy things out in order
       to get its notion of a string.</dd>
-    </dl></p>
+    </dl>
 
   <h3>Packet Size</h3>
     <p>According to much of the code, the max packet size is <code>
     ASCII code for B).  After those first two bytes, there is an integer
     (encoded as above) with the length of the payload.  Although this might
     suggest that the maximum payload could be as large as 2^16, in fact, the
-    code sets the maximum to be 8K.
+    code sets the maximum to be 8K.</p>
     <table>
+       
       <tr>
-        <td colspan="6"><em>Packet Format (Server-&gt;Container)</em></td>
+        <th colspan="6"><em>Packet Format (Server-&gt;Container)</em></th>
       </tr>
       <tr>
-        <td>Byte</td>
+        <th>Byte</th>
         <td>0</td>
         <td>1</td>
         <td>2</td>
         <td>4...(n+3)</td>
       </tr>
       <tr>
-        <td>Contents</td>
+        <th>Contents</th>
         <td>0x12</td>
         <td>0x34</td>
         <td colspan="2">Data Length (n)</td>
       </tr>
     </table>
     <table>
+       
       <tr>
-        <td colspan="6"><em>Packet Format (Container-&gt;Server)</em></td>
+        <th colspan="6"><em>Packet Format (Container-&gt;Server)</em></th>
       </tr>
       <tr>
-        <td>Byte</td>
+        <th>Byte</th>
         <td>0</td>
         <td>1</td>
         <td>2</td>
         <td>4...(n+3)</td>
       </tr>
       <tr>
-        <td>Contents</td>
+        <th>Contents</th>
         <td>A</td>
         <td>B</td>
         <td colspan="2">Data Length (n)</td>
         <td>Data</td>
       </tr>
-    </table></p>
+    </table>
     <p>For most packets, the first byte of the payload encodes the type of
      message.  The exception is for request body packets sent from the server to
      the container -- they are sent with a standard packet header (<code>
      0x1234</code> and then length of the packet), but without any prefix code
      after that.</p>
-     <p>The web server can send the following messages to the servlet container:
+     <p>The web server can send the following messages to the servlet
+     container:</p>
     <table>
+       
       <tr>
         <td>Code</td>
         <td>Type of Packet</td>
         <td>Data</td>
         <td>Size (2 bytes) and corresponding body data.</td>
       </tr>
-    </table></p>
+    </table>
     <p>To ensure some basic security, the container will only actually do the
     <code>Shutdown</code> if the request comes from the same machine on which
     it's hosted.</p>
-    <p>The first <code>Data</code> packet is send immediatly after the
+    <p>The first <code>Data</code> packet is send immediately after the
     <code>Forward Request</code> by the web server.</p>
     <p>The servlet container can send the following types of messages to the
-    webserver:
+    webserver:</p>
     <table>
+       
       <tr>
         <td>Code</td>
         <td>Type of Packet</td>
         <td>CPong Reply</td>
         <td>The reply to a CPing request</td>
       </tr>
-    </table></p>
+    </table>
     <p>Each of the above messages has a different internal structure, detailed
     below.</p>
   
 <h2><a name="rpacetstruct" id="rpacetstruct">Request Packet Structure</a></h2>
     <p>For messages from the server to the container of type
     <em>Forward Request</em>:</p>
-    <div class="example"><pre>
-AJP13_FORWARD_REQUEST :=
+    <div class="example"><pre>AJP13_FORWARD_REQUEST :=
     prefix_code      (byte) 0x02 = JK_AJP13_FORWARD_REQUEST
     method           (byte)
     protocol         (string)
@@ -295,25 +344,19 @@ AJP13_FORWARD_REQUEST :=
     num_headers      (integer)
     request_headers *(req_header_name req_header_value)
     attributes      *(attribut_name attribute_value)
-    request_terminator (byte) OxFF
-    </pre></div>
+    request_terminator (byte) OxFF</pre></div>
     <p>The <code>request_headers</code> have the following structure:
-    </p><div class="example"><pre>
-req_header_name := 
+    </p><div class="example"><pre>req_header_name :=
     sc_req_header_name | (string)  [see below for how this is parsed]
 
 sc_req_header_name := 0xA0xx (integer)
 
-req_header_value := (string)
-</pre></div>
+req_header_value := (string)</pre></div>
     <p>The <code>attributes</code> are optional and have the following
     structure:</p>
-    <div class="example"><pre>
-attribute_name := sc_a_name | (sc_a_req_attribute string)
-
-attribute_value := (string)
+    <div class="example"><pre>attribute_name := sc_a_name | (sc_a_req_attribute string)
 
-    </pre></div>
+attribute_value := (string)</pre></div>
     <p>Not that the all-important header is <code>content-length</code>,
     because it determines whether or not the container looks for another
     packet immediately.</p>
@@ -325,7 +368,7 @@ attribute_value := (string)
   
   <h3>Method</h3>
     <p>The HTTP method, encoded as a single byte:</p>
-    <p><table>
+    <table>
       <tr><td>Command Name</td><td>Code</td></tr>
       <tr><td>OPTIONS</td><td>1</td></tr>
       <tr><td>GET</td><td>2</td></tr>
@@ -354,8 +397,8 @@ attribute_value := (string)
       <tr><td>MERGE</td><td>25</td></tr>
       <tr><td>BASELINE_CONTROL</td><td>26</td></tr>
       <tr><td>MKACTIVITY</td><td>27</td></tr>
-    </table></p>
-    <p>Later version of ajp13, will transport 
+    </table>
+    <p>Later version of ajp13, will transport
     additional methods, even if they are not in this list.</p>
   
   <h3>protocol, req_uri, remote_addr, remote_host, server_name,
@@ -373,7 +416,7 @@ attribute_value := (string)
     it is encoded normally (as a string, with prefixed length).  The list of
     common headers <code>sc_req_header_name</code>and their codes
     is as follows (all are case-sensitive):</p>
-    <p><table>
+    <table>
       <tr><td>Name</td><td>Code value</td><td>Code name</td></tr>
       <tr><td>accept</td><td>0xA001</td><td>SC_REQ_ACCEPT</td></tr>
       <tr><td>accept-charset</td><td>0xA002</td><td>SC_REQ_ACCEPT_CHARSET
@@ -395,14 +438,14 @@ attribute_value := (string)
       <tr><td>pragma</td><td>0xA00C</td><td>SC_REQ_PRAGMA</td></tr>
       <tr><td>referer</td><td>0xA00D</td><td>SC_REQ_REFERER</td></tr>
       <tr><td>user-agent</td><td>0xA00E</td><td>SC_REQ_USER_AGENT</td></tr>
-    </table></p>
+    </table>
     <p>The Java code that reads this grabs the first two-byte integer and if
     it sees an <code>'0xA0'</code> in the most significant
     byte, it uses the integer in the second byte as an index into an array of
     header names.  If the first byte is not <code>0xA0</code>, it assumes that
     the two-byte integer is the length of a string, which is then read in.</p>
     <p>This works on the assumption that no header names will have length
-    greater than <code>0x9999 (==0xA000 - 1)</code>, which is perfectly
+    greater than <code>0x9FFF (==0xA000 - 1)</code>, which is perfectly
     reasonable, though somewhat arbitrary.</p>
     <div class="note"><h3>Note:</h3>
     The <code>content-length</code> header is extremely
@@ -414,29 +457,29 @@ attribute_value := (string)
   <h3>Attributes</h3>
     <p>The attributes prefixed with a <code>?</code>
     (e.g. <code>?context</code>) are all optional.  For each, there is a
-    single byte code to indicate the type of attribute, and then a string to
-    give its value.  They can be sent in any order (thogh the C code always
-    sends them in the order listed below).  A special terminating code is
-    sent to signal the end of the list of optional attributes. The list of
+    single byte code to indicate the type of attribute, and then its value
+    (string or integer).  They can be sent in any order (though the C code
+    always sends them in the order listed below).  A special terminating code
+    is sent to signal the end of the list of optional attributes. The list of
     byte codes is:</p>
-    <p><table>
-      <tr><td>Information</td><td>Code Value</td><td>Note</td></tr>
-      <tr><td>?context</td><td>0x01</td><td>Not currently implemented
+    <table>
+      <tr><td>Information</td><td>Code Value</td><td>Type Of Value</td><td>Note</td></tr>
+      <tr><td>?context</td><td>0x01</td><td>-</td><td>Not currently implemented
       </td></tr>
-      <tr><td>?servlet_path</td><td>0x02</td><td>Not currently implemented
+      <tr><td>?servlet_path</td><td>0x02</td><td>-</td><td>Not currently implemented
       </td></tr>
-      <tr><td>?remote_user</td><td>0x03</td><td /></tr>
-      <tr><td>?auth_type</td><td>0x04</td><td /></tr>
-      <tr><td>?query_string</td><td>0x05</td><td /></tr>
-      <tr><td>?jvm_route</td><td>0x06</td><td /></tr>
-      <tr><td>?ssl_cert</td><td>0x07</td><td /></tr>
-      <tr><td>?ssl_cipher</td><td>0x08</td><td /></tr>
-      <tr><td>?ssl_session</td><td>0x09</td><td /></tr>
-      <tr><td>?req_attribute</td><td>0x0A</td><td>Name (the name of the
+      <tr><td>?remote_user</td><td>0x03</td><td>String</td><td /></tr>
+      <tr><td>?auth_type</td><td>0x04</td><td>String</td><td /></tr>
+      <tr><td>?query_string</td><td>0x05</td><td>String</td><td /></tr>
+      <tr><td>?jvm_route</td><td>0x06</td><td>String</td><td /></tr>
+      <tr><td>?ssl_cert</td><td>0x07</td><td>String</td><td /></tr>
+      <tr><td>?ssl_cipher</td><td>0x08</td><td>String</td><td /></tr>
+      <tr><td>?ssl_session</td><td>0x09</td><td>String</td><td /></tr>
+      <tr><td>?req_attribute</td><td>0x0A</td><td>String</td><td>Name (the name of the
       attribute follows)</td></tr>
-      <tr><td>?ssl_key_size</td><td>0x0B</td><td /></tr>
-      <tr><td>are_done</td><td>0xFF</td><td>request_terminator</td></tr>
-    </table></p>
+      <tr><td>?ssl_key_size</td><td>0x0B</td><td>Integer</td><td /></tr>
+      <tr><td>are_done</td><td>0xFF</td><td>-</td><td>request_terminator</td></tr>
+    </table>
     <p>The <code>context</code> and <code>servlet_path</code> are not
     currently set by the C code, and most of the Java code completely ignores
     whatever is sent over for those fields (and some of it will actually break
@@ -466,11 +509,11 @@ attribute_value := (string)
 <div class="section">
 <h2><a name="resppacketstruct" id="resppacketstruct">Response Packet Structure</a></h2>
     <p>for messages which the container can send back to the server.</p>
-    <div class="example"><pre>
-AJP13_SEND_BODY_CHUNK :=
+    <div class="example"><pre>AJP13_SEND_BODY_CHUNK :=
   prefix_code   3
   chunk_length  (integer)
   chunk        *(byte)
+  chunk_terminator (byte) Ox00
 
 
 AJP13_SEND_HEADERS :=
@@ -494,8 +537,7 @@ AJP13_END_RESPONSE :=
 
 AJP13_GET_BODY_CHUNK :=
   prefix_code       6
-  requested_length  (integer)
-    </pre></div>
+  requested_length  (integer)</pre></div>
   <h3>Details:</h3>
   <h3>Send Body Chunk</h3>
     <p>The chunk is basically binary data, and is sent directly back to the
@@ -505,9 +547,9 @@ AJP13_GET_BODY_CHUNK :=
     <p>The status code and message are the usual HTTP things
     (e.g. <code>200</code> and <code>OK</code>). The response header names are
     encoded the same way the request header names are. See header_encoding above
-    for details about how the the codes are distinguished from the strings.<br />
+    for details about how the codes are distinguished from the strings.<br />
     The codes for common headers are:</p>
-    <p><table>
+    <table>
       <tr><td>Name</td><td>Code value</td></tr>
       <tr><td>Content-Type</td><td>0xA001</td></tr>
       <tr><td>Content-Language</td><td>0xA002</td></tr>
@@ -520,21 +562,21 @@ AJP13_GET_BODY_CHUNK :=
       <tr><td>Servlet-Engine</td><td>0xA009</td></tr>
       <tr><td>Status</td><td>0xA00A</td></tr>
       <tr><td>WWW-Authenticate</td><td>0xA00B</td></tr>
-    </table></p>
+    </table>
     <p> After the code or the string header name, the header value is
     immediately encoded.</p>
   
   <h3>End Response</h3>
     <p>Signals the end of this request-handling cycle.  If the
-    <code>reuse</code> flag is true <code>(==1)</code>, this TCP connection can
-    now be used to handle new incoming requests.  If <code>reuse</code> is false
-    (anything other than 1 in the actual C code), the connection should
+    <code>reuse</code> flag is true <code>(anything other than 0 in the actual
+    C code)</code>, this TCP connection can now be used to handle new incoming
+    requests.  If <code>reuse</code> is false (==0), the connection should
     be closed.</p>
   
   <h3>Get Body Chunk</h3>
     <p>The container asks for more data from the request (If the body was
     too large to fit in the first packet sent over or when the request is
-    chuncked). The server will send a body packet back with an amount of data
+    chunked). The server will send a body packet back with an amount of data
     which is the minimum of the <code>request_length</code>, the maximum send
     body size <code>(8186 (8 Kbytes - 6))</code>, and the number of bytes
     actually left to send from the request body.<br />
@@ -546,8 +588,30 @@ AJP13_GET_BODY_CHUNK :=
 </div>
 </div>
 <div class="bottomlang">
-<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_ajp.html" title="English">&nbsp;en&nbsp;</a></p>
-</div><div id="footer">
-<p class="apache">Copyright 1999-2004 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>
-<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div>
+<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_ajp.html" title="English">&nbsp;en&nbsp;</a> |
+<a href="../ja/mod/mod_proxy_ajp.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a></p>
+</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&amp;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>
+<script type="text/javascript"><!--//--><![CDATA[//><!--
+var comments_shortname = 'httpd';
+var comments_identifier = 'http://httpd.apache.org/docs/trunk/mod/mod_proxy_ajp.html';
+(function(w, d) {
+    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
+        d.write('<div id="comments_thread"><\/div>');
+        var s = d.createElement('script');
+        s.type = 'text/javascript';
+        s.async = true;
+        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
+        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
+    }
+    else {
+        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
+    }
+})(window, document);
+//--><!]]></script></div><div id="footer">
+<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>
+<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[//><!--
+if (typeof(prettyPrint) !== 'undefined') {
+    prettyPrint();
+}
+//--><!]]></script>
 </body></html>
\ No newline at end of file