Geoffrey,

Once again, I appreciate your informative responses.

I've decided to abandon the idea in favor of using mod_rewrite.

I discovered the back reference capability in mod_rewrite and combined with some php trickery have been able to produce the desired shared ssl effect.

Thank you again for your wonderful assistance.

Respectfully,


Gary



Geoffrey Young wrote:

Gary C. New wrote:


I am very near in completing a module that allows one to dynamically
re-map Apache's DocumentRoot directive based on a given URI.

I've been able to get past several obstacles, but am having a very
difficult time understanding the request object work flow.

My problem seems to be due to subrequests not being mapped properly.

The initial request seems to map as it should, but subrequests are
randomly mapped or not mapped at all.  I can reload the same page and
get different subrequests to map, while the previously working
subrequests no longer map.


this is a really difficult thing you are trying to do.

basically, DocumentRoot is a property of the server - if you modify it the
changes are propagated for all later requests to the same Apache child.  so,
if you want to mess with it you need to be sure to set it back before the
next request starts.

so, say you have a request where you change the DocumentRoot and schedule a
cleanup to reset it.  now, in the middle of that request you have a
subrequest.  this subrequest probably thinks that the original DocumentRoot
is the one you just set in the main request, etc.

messing around with server attributes on a per-request level is tricky.  in
general, I'd suggest against it - the only reason I've ever seen where it is
required to alter the DocumentRoot is for supporting FrontPage extensions.
other than that, there are ways around coding a dependency around
$ENV{DOCUMENT_ROOT}, such as coherent relative paths - it's is supposed to
be private to Apache core anyway :)

that said, you might be able to add some logic so that the the real
DocumentRoot is set in $r->notes via

$r->notes(?REAL_DOCROOT => $r->document_root) if $r->is_initial_req;

then for restoration everyone looks at $r->main->notes instead of relying on
what is in $r->document_root.

as an alternative, you could always just place the value you want for your
new DocumentRoot in notes from a fixup handler, then crack open
util_script.c in the apache 1.3 sources, and alter ap_add_common_vars to use
your notes value for DOCUMENT_ROOT instead of ap_document_root.  something
like this (untested)

Index: src/main/util_script.c
===================================================================
RCS file: /home/cvspublic/apache-1.3/src/main/util_script.c,v
retrieving revision 1.168
diff -u -r1.168 util_script.c
--- src/main/util_script.c      1 Jan 2004 13:32:54 -0000       1.168
+++ src/main/util_script.c      11 Feb 2004 15:08:06 -0000
@@ -203,6 +203,7 @@
     array_header *hdrs_arr = ap_table_elts(r->headers_in);
     table_entry *hdrs = (table_entry *) hdrs_arr->elts;
     int i;
+    char *docroot;

     /* use a temporary table which we'll overlap onto
      * r->subprocess_env later
@@ -290,7 +291,10 @@
        ap_table_addn(e, "REMOTE_HOST", host);
     }
     ap_table_addn(e, "REMOTE_ADDR", c->remote_ip);
-    ap_table_addn(e, "DOCUMENT_ROOT", ap_document_root(r));    /* Apache */
+    if (! (docroot = ap_table_get(r->notes, "REAL_DOCROOT")) ) {
+        docroot = ap_document_root(r);
+    }
+    ap_table_addn(e, "DOCUMENT_ROOT", docroot);        /* Apache */
     ap_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */
     ap_table_addn(e, "SCRIPT_FILENAME", r->filename);  /* Apache */


HTH


--Geoff





-- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html



Reply via email to