nginx-0.3.8-RELEASE import

    *) Security: nginx now checks URI got from a backend in
       "X-Accel-Redirect" header line or in SSI file for the "/../" paths
       and zeroes.

    *) Change: nginx now does not treat the empty user name in the
       "Authorization" header line as valid one.

    *) Feature: the "ssl_session_timeout" directives of the
       ngx_http_ssl_module and ngx_imap_ssl_module.

    *) Feature: the "auth_http_header" directive of the
       ngx_imap_auth_http_module.

    *) Feature: the "add_header" directive.

    *) Feature: the ngx_http_realip_module.

    *) Feature: the new variables to use in the "log_format" directive:
       $bytes_sent, $apache_bytes_sent, $status, $time_gmt, $uri,
       $request_time, $request_length, $upstream_status,
       $upstream_response_time, $gzip_ratio, $uid_got, $uid_set,
       $connection, $pipe, and $msec. The parameters in the "%name" form
       will be canceled soon.

    *) Change: now the false variable values in the "if" directive are the
       empty string "" and string starting with "0".

    *) Bugfix: while using proxied or FastCGI-server nginx may leave
       connections and temporary files with client requests in open state.

    *) Bugfix: the worker processes did not flush the buffered logs on
       graceful exit.

    *) Bugfix: if the request URI was changes by the "rewrite" directive
       and the request was proxied in location given by regular expression,
       then the incorrect request was transferred to backend; the bug had
       appeared in 0.2.6.

    *) Bugfix: the "expires" directive did not remove the previous
       "Expires" header.

    *) Bugfix: nginx may stop to accept requests if the "rtsig" method and
       several worker processes were used.

    *) Bugfix: the "\"" and "\'" escape symbols were incorrectly handled in
       SSI commands.

    *) Bugfix: if the response was ended just after the SSI command and
       gzipping was used, then the response did not transferred complete or
       did not transferred at all.
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index a12a134..c230860 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -22,7 +22,6 @@
     ngx_array_t *locations, size_t len);
 
 static ngx_int_t ngx_http_core_preconfiguration(ngx_conf_t *cf);
-static ngx_int_t ngx_http_core_postconfiguration(ngx_conf_t *cf);
 static void *ngx_http_core_create_main_conf(ngx_conf_t *cf);
 static char *ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf);
 static void *ngx_http_core_create_srv_conf(ngx_conf_t *cf);
@@ -368,7 +367,7 @@
 
 ngx_http_module_t  ngx_http_core_module_ctx = {
     ngx_http_core_preconfiguration,        /* preconfiguration */
-    ngx_http_core_postconfiguration,       /* postconfiguration */
+    NULL,                                  /* postconfiguration */
 
     ngx_http_core_create_main_conf,        /* create main configuration */
     ngx_http_core_init_main_conf,          /* init main configuration */
@@ -448,7 +447,8 @@
     r->uri_changed = 1;
     r->uri_changes = NGX_HTTP_MAX_REWRITE_CYCLES + 1;
 
-    r->phase = NGX_HTTP_REWRITE_PHASE;
+    r->phase = (r->main == r) ? NGX_HTTP_POST_READ_PHASE:
+                                NGX_HTTP_SERVER_REWRITE_PHASE;
     r->phase_handler = 0;
 
     ngx_http_core_run_phases(r);
@@ -991,7 +991,7 @@
         return NULL;
     }
 
-    last = ngx_cpymem(path->data, clcf->root.data, clcf->root.len);
+    last = ngx_copy(path->data, clcf->root.data, clcf->root.len);
     last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1);
 
     return last;
@@ -1054,7 +1054,7 @@
         }
     }
     
-    if (len == auth.len) {
+    if (len == 0 || len == auth.len) {
         r->headers_in.user.data = (u_char *) "";
         return NGX_DECLINED;
     }
@@ -1070,7 +1070,7 @@
 
 ngx_int_t
 ngx_http_subrequest(ngx_http_request_t *r,
-    ngx_str_t *uri, ngx_str_t *args)
+    ngx_str_t *uri, ngx_str_t *args, ngx_uint_t flags)
 {
     ngx_http_request_t            *sr;
     ngx_http_core_srv_conf_t      *cscf;
@@ -1116,9 +1116,21 @@
 
     sr->request_line = r->request_line;
     sr->uri = *uri;
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "http subrequest \"%V\"", uri);
+
     if (args) {
         sr->args = *args;
+
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                       "http subrequest args \"%V\"", args);
     }
+
+    if (flags & NGX_HTTP_ZERO_IN_URI) {
+        sr->zero_in_uri = 1;
+    }
+
     sr->unparsed_uri = r->unparsed_uri;
     sr->method_name = r->method_name;
     sr->http_protocol = r->http_protocol;
@@ -1167,9 +1179,6 @@
     sr->discard_body = r->discard_body;
     sr->main_filter_need_in_memory = r->main_filter_need_in_memory;
 
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "http subrequest \"%V\"", uri);
-
     ngx_http_handler(sr);
 
     /* the request pool may be already destroyed */
@@ -1192,6 +1201,9 @@
     if (args) {
         r->args = *args;
 
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                       "internal redirect args: \"%V\"", args);
+
     } else {
         r->args.len = 0;
         r->args.data = NULL;
@@ -1657,13 +1669,6 @@
 }
 
 
-static ngx_int_t
-ngx_http_core_postconfiguration(ngx_conf_t *cf)
-{
-    return ngx_http_variables_init_vars(cf);
-}
-
-
 static void *
 ngx_http_core_create_main_conf(ngx_conf_t *cf)
 {