this allows you to pass a 'path' to the fast cgi process
to use:
ProxyPass  /forum fcgi-tcp://127.0.0.1:8005/foruX

request
/forum/zx will have a path_info of /foruX/zx

posting it as a patch, as the code is a bit fugly.

Index: mod_proxy_fcgi.c
===================================================================
--- mod_proxy_fcgi.c    (revision 366086)
+++ mod_proxy_fcgi.c    (working copy)
@@ -28,6 +28,7 @@
static int proxy_fcgi_canon(request_rec *r, char *url)
{
    char *host, sport[7];
+    char *path;
    const char *err;
    const char* scheme;
    apr_port_t port = 8000;
@@ -62,8 +63,13 @@
            host = apr_pstrcat(r->pool, "[", host, "]", NULL);
        }
- r->filename = apr_pstrcat(r->pool, "proxy:", scheme, host, sport, "/", + path = ap_proxy_canonenc(r->pool, url, strlen(url), enc_path, 0, r->proxyreq);
+        if (path == NULL)
+            return HTTP_BAD_REQUEST;
+
+ r->filename = apr_pstrcat(r->pool, "proxy:", scheme, host, sport, "/", path,
                                  NULL);
+
    }
    else if (strncmp(url, "local://", 8) == 0) {
        url += 6;
@@ -130,6 +136,7 @@
{
    const apr_array_header_t *envarr;
    const apr_table_entry_t *elts;
+    char *path;
    struct iovec vec[2];
    fcgi_header header;
    apr_size_t bodylen;
@@ -143,6 +150,18 @@
    ap_add_common_vars(r);
    ap_add_cgi_vars(r);

+    if (r->path_info) {
+        apr_table_setn(r->subprocess_env, "PATH_INFO", r->path_info);
+    }
+    else {
+        path = ap_strchr_c( r->filename,'/');
+        if (path) {
+            path = ap_strchr_c( path,':');
+        }
+        if (path) {
+ apr_table_setn(r->subprocess_env, "PATH_INFO", ap_strchr_c(path, '/'));
+        }
+    }
    /* XXX are there any FastCGI specific env vars we need to send? */

    /* XXX What if there is over 64k worth of data in the env? */

Reply via email to