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="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
    23  <div id="path">
    24  <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.2</a> &gt; <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">&nbsp;en&nbsp;</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">&lt;Location&gt;</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">&lt;Proxy&gt;</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">&lt;Directory&gt;</a></code> and <code class="directive"><a href="../mod/core.html#files">&lt;Files&gt;</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">&lt;Location&gt;</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">&nbsp;en&nbsp;</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&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>
   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>