github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/tests/data/apache_2_2_34/manual/developer/request.html.en (about) 1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> 4 <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" /> 5 <!-- 6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 7 This file is generated from xml source: DO NOT EDIT 8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 9 --> 10 <title>Request Processing in the Apache HTTP Server 2.x - Apache HTTP Server Version 2.2</title> 11 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" /> 12 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" /> 13 <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" /> 14 <script src="../style/scripts/prettify.min.js" type="text/javascript"> 15 </script> 16 17 <link href="../images/favicon.ico" rel="shortcut icon" /><link href="http://httpd.apache.org/docs/current/developer/request.html" rel="canonical" /></head> 18 <body id="manual-page"><div id="page-header"> 19 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.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> 20 <p class="apache">Apache HTTP Server Version 2.2</p> 21 <img alt="" src="../images/feather.gif" /></div> 22 <div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div> 23 <div id="path"> 24 <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.2</a> > <a href="./">Developer Documentation</a></div><div id="page-content"><div class="retired"><h4>Please note</h4> 25 <p> This document refers to a legacy release (<strong>2.2</strong>) of Apache httpd. The active release (<strong>2.4</strong>) is documented <a href="http://httpd.apache.org/docs/current">here</a>. If you have not already upgraded, please follow <a href="http://httpd.apache.org/docs/current/upgrading.html">this link</a> for more information.</p> 26 <p>You may follow <a href="http://httpd.apache.org/docs/current/developer/request.html">this link</a> to go to the current version of this document.</p></div><div id="preamble"><h1>Request Processing in the Apache HTTP Server 2.x</h1> 27 <div class="toplang"> 28 <p><span>Available Languages: </span><a href="../en/developer/request.html" title="English"> en </a></p> 29 </div> 30 31 <div class="warning"><h3>Warning</h3> 32 <p>Warning - this is a first (fast) draft that needs further 33 revision!</p> 34 </div> 35 36 <p>Several changes in 2.0 and above affect the internal request 37 processing mechanics. Module authors need to be aware of these 38 changes so they may take advantage of the optimizations and 39 security enhancements.</p> 40 41 <p>The first major change is to the subrequest and redirect 42 mechanisms. There were a number of different code paths in 43 the Apache HTTP Server 1.3 to attempt to optimize subrequest 44 or redirect behavior. As patches were introduced to 2.0, these 45 optimizations (and the server behavior) were quickly broken due 46 to this duplication of code. All duplicate code has been folded 47 back into <code>ap_process_request_internal()</code> to prevent 48 the code from falling out of sync again.</p> 49 50 <p>This means that much of the existing code was 'unoptimized'. 51 It is the Apache HTTP Project's first goal to create a robust 52 and correct implementation of the HTTP server RFC. Additional 53 goals include security, scalability and optimization. New 54 methods were sought to optimize the server (beyond the 55 performance of 1.3) without introducing fragile or 56 insecure code.</p> 57 </div> 58 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#processing">The Request Processing Cycle</a></li> 59 <li><img alt="" src="../images/down.gif" /> <a href="#parsing">The Request Parsing Phase</a></li> 60 <li><img alt="" src="../images/down.gif" /> <a href="#security">The Security Phase</a></li> 61 <li><img alt="" src="../images/down.gif" /> <a href="#preparation">The Preparation Phase</a></li> 62 <li><img alt="" src="../images/down.gif" /> <a href="#handler">The Handler Phase</a></li> 63 </ul><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div> 64 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> 65 <div class="section"> 66 <h2><a name="processing" id="processing">The Request Processing Cycle</a></h2> 67 <p>All requests pass through <code>ap_process_request_internal()</code> 68 in <code>request.c</code>, including subrequests and redirects. If a module 69 doesn't pass generated requests through this code, the author is cautioned 70 that the module may be broken by future changes to request 71 processing.</p> 72 73 <p>To streamline requests, the module author can take advantage 74 of the hooks offered to drop out of the request cycle early, or 75 to bypass core hooks which are irrelevant (and costly in 76 terms of CPU.)</p> 77 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> 78 <div class="section"> 79 <h2><a name="parsing" id="parsing">The Request Parsing Phase</a></h2> 80 <h3><a name="unescape" id="unescape">Unescapes the URL</a></h3> 81 <p>The request's <code>parsed_uri</code> path is unescaped, once and only 82 once, at the beginning of internal request processing.</p> 83 84 <p>This step is bypassed if the proxyreq flag is set, or the 85 <code>parsed_uri.path</code> element is unset. The module has no further 86 control of this one-time unescape operation, either failing to 87 unescape or multiply unescaping the URL leads to security 88 repercussions.</p> 89 90 91 <h3><a name="strip" id="strip">Strips Parent and This Elements from the 92 URI</a></h3> 93 <p>All <code>/../</code> and <code>/./</code> elements are 94 removed by <code>ap_getparents()</code>. This helps to ensure 95 the path is (nearly) absolute before the request processing 96 continues.</p> 97 98 <p>This step cannot be bypassed.</p> 99 100 101 <h3><a name="inital-location-walk" id="inital-location-walk">Initial URI Location Walk</a></h3> 102 <p>Every request is subject to an 103 <code>ap_location_walk()</code> call. This ensures that 104 <code class="directive"><a href="../mod/core.html#location"><Location></a></code> sections 105 are consistently enforced for all requests. If the request is an internal 106 redirect or a sub-request, it may borrow some or all of the processing 107 from the previous or parent request's ap_location_walk, so this step 108 is generally very efficient after processing the main request.</p> 109 110 111 <h3><a name="translate_name" id="translate_name">translate_name</a></h3> 112 <p>Modules can determine the file name, or alter the given URI 113 in this step. For example, <code class="module"><a href="../mod/mod_vhost_alias.html">mod_vhost_alias</a></code> will 114 translate the URI's path into the configured virtual host, 115 <code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code> will translate the path to an alias path, 116 and if the request falls back on the core, the <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> is prepended to the request resource.</p> 117 118 <p>If all modules <code>DECLINE</code> this phase, an error 500 is 119 returned to the browser, and a "couldn't translate name" error is logged 120 automatically.</p> 121 122 123 <h3><a name="map_to_storage" id="map_to_storage">Hook: map_to_storage</a></h3> 124 <p>After the file or correct URI was determined, the 125 appropriate per-dir configurations are merged together. For 126 example, <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> compares and merges the appropriate 127 <code class="directive"><a href="../mod/mod_proxy.html#proxy"><Proxy></a></code> sections. 128 If the URI is nothing more than a local (non-proxy) <code>TRACE</code> 129 request, the core handles the request and returns <code>DONE</code>. 130 If no module answers this hook with <code>OK</code> or <code>DONE</code>, 131 the core will run the request filename against the <code class="directive"><a href="../mod/core.html#directory"><Directory></a></code> and <code class="directive"><a href="../mod/core.html#files"><Files></a></code> sections. If the request 132 'filename' isn't an absolute, legal filename, a note is set for 133 later termination.</p> 134 135 136 <h3><a name="location-walk" id="location-walk">URI Location Walk</a></h3> 137 <p>Every request is hardened by a second 138 <code>ap_location_walk()</code> call. This reassures that a 139 translated request is still subjected to the configured 140 <code class="directive"><a href="../mod/core.html#location"><Location></a></code> sections. 141 The request again borrows some or all of the processing from its previous 142 <code>location_walk</code> above, so this step is almost always very 143 efficient unless the translated URI mapped to a substantially different 144 path or Virtual Host.</p> 145 146 147 <h3><a name="header_parser" id="header_parser">Hook: header_parser</a></h3> 148 <p>The main request then parses the client's headers. This 149 prepares the remaining request processing steps to better serve 150 the client's request.</p> 151 152 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> 153 <div class="section"> 154 <h2><a name="security" id="security">The Security Phase</a></h2> 155 <p>Needs Documentation. Code is:</p> 156 157 <div class="example"><pre>switch (ap_satisfies(r)) { 158 case SATISFY_ALL: 159 case SATISFY_NOSPEC: 160 if ((access_status = ap_run_access_checker(r)) != 0) { 161 return decl_die(access_status, "check access", r); 162 } 163 164 if (ap_some_auth_required(r)) { 165 if (((access_status = ap_run_check_user_id(r)) != 0) 166 || !ap_auth_type(r)) { 167 return decl_die(access_status, ap_auth_type(r) 168 ? "check user. No user file?" 169 : "perform authentication. AuthType not set!", 170 r); 171 } 172 173 if (((access_status = ap_run_auth_checker(r)) != 0) 174 || !ap_auth_type(r)) { 175 return decl_die(access_status, ap_auth_type(r) 176 ? "check access. No groups file?" 177 : "perform authentication. AuthType not set!", 178 r); 179 } 180 } 181 break; 182 183 case SATISFY_ANY: 184 if (((access_status = ap_run_access_checker(r)) != 0)) { 185 if (!ap_some_auth_required(r)) { 186 return decl_die(access_status, "check access", r); 187 } 188 189 if (((access_status = ap_run_check_user_id(r)) != 0) 190 || !ap_auth_type(r)) { 191 return decl_die(access_status, ap_auth_type(r) 192 ? "check user. No user file?" 193 : "perform authentication. AuthType not set!", 194 r); 195 } 196 197 if (((access_status = ap_run_auth_checker(r)) != 0) 198 || !ap_auth_type(r)) { 199 return decl_die(access_status, ap_auth_type(r) 200 ? "check access. No groups file?" 201 : "perform authentication. AuthType not set!", 202 r); 203 } 204 } 205 break; 206 }</pre></div> 207 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> 208 <div class="section"> 209 <h2><a name="preparation" id="preparation">The Preparation Phase</a></h2> 210 <h3><a name="type_checker" id="type_checker">Hook: type_checker</a></h3> 211 <p>The modules have an opportunity to test the URI or filename 212 against the target resource, and set mime information for the 213 request. Both <code class="module"><a href="../mod/mod_mime.html">mod_mime</a></code> and 214 <code class="module"><a href="../mod/mod_mime_magic.html">mod_mime_magic</a></code> use this phase to compare the file 215 name or contents against the administrator's configuration and set the 216 content type, language, character set and request handler. Some modules 217 may set up their filters or other request handling parameters at this 218 time.</p> 219 220 <p>If all modules <code>DECLINE</code> this phase, an error 500 is 221 returned to the browser, and a "couldn't find types" error is logged 222 automatically.</p> 223 224 225 <h3><a name="fixups" id="fixups">Hook: fixups</a></h3> 226 <p>Many modules are 'trounced' by some phase above. The fixups 227 phase is used by modules to 'reassert' their ownership or force 228 the request's fields to their appropriate values. It isn't 229 always the cleanest mechanism, but occasionally it's the only 230 option.</p> 231 232 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div> 233 <div class="section"> 234 <h2><a name="handler" id="handler">The Handler Phase</a></h2> 235 <p>This phase is <strong>not</strong> part of the processing in 236 <code>ap_process_request_internal()</code>. Many 237 modules prepare one or more subrequests prior to creating any 238 content at all. After the core, or a module calls 239 <code>ap_process_request_internal()</code> it then calls 240 <code>ap_invoke_handler()</code> to generate the request.</p> 241 242 <h3><a name="insert_filter" id="insert_filter">Hook: insert_filter</a></h3> 243 <p>Modules that transform the content in some way can insert 244 their values and override existing filters, such that if the 245 user configured a more advanced filter out-of-order, then the 246 module can move its order as need be. There is no result code, 247 so actions in this hook better be trusted to always succeed.</p> 248 249 250 <h3><a name="hook_handler" id="hook_handler">Hook: handler</a></h3> 251 <p>The module finally has a chance to serve the request in its 252 handler hook. Note that not every prepared request is sent to 253 the handler hook. Many modules, such as <code class="module"><a href="../mod/mod_autoindex.html">mod_autoindex</a></code>, 254 will create subrequests for a given URI, and then never serve the 255 subrequest, but simply lists it for the user. Remember not to 256 put required teardown from the hooks above into this module, 257 but register pool cleanups against the request pool to free 258 resources as required.</p> 259 260 </div></div> 261 <div class="bottomlang"> 262 <p><span>Available Languages: </span><a href="../en/developer/request.html" title="English"> en </a></p> 263 </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> 264 <script type="text/javascript"><!--//--><![CDATA[//><!-- 265 var comments_shortname = 'httpd'; 266 var comments_identifier = 'http://httpd.apache.org/docs/2.2/developer/request.html'; 267 (function(w, d) { 268 if (w.location.hostname.toLowerCase() == "httpd.apache.org") { 269 d.write('<div id="comments_thread"><\/div>'); 270 var s = d.createElement('script'); 271 s.type = 'text/javascript'; 272 s.async = true; 273 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier; 274 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s); 275 } 276 else { 277 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>'); 278 } 279 })(window, document); 280 //--><!]]></script></div><div id="footer"> 281 <p class="apache">Copyright 2017 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> 282 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.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[//><!-- 283 if (typeof(prettyPrint) !== 'undefined') { 284 prettyPrint(); 285 } 286 //--><!]]></script> 287 </body></html>