]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Allow reverse-proxy to be set via explicit handler
authorJim Jagielski <jim@apache.org>
Mon, 3 Mar 2014 17:28:17 +0000 (17:28 +0000)
committerJim Jagielski <jim@apache.org>
Mon, 3 Mar 2014 17:28:17 +0000 (17:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1573626 13f79535-47bb-0310-9956-ffa450edef68

docs/manual/mod/mod_proxy.xml
modules/proxy/mod_proxy.c

index d0adb3a3ae0e98684628f06c9018ad205d3ec6b5..e7b5a9fd3abeeab75a64091686c7a4e40b6224ff 100644 (file)
@@ -171,6 +171,23 @@ ProxyVia On
     </example>
     </section> <!-- /examples -->
 
+    <section id="handler"><title>Access via Handler</title>
+
+    <p>You can also force a request to be handled as a reverse-proxy
+      request, by creating a suitable Handler pass-thru. For example,
+      the below will pass all PHP scripts to the specified
+      reverse-proxy FCGI server:
+    </p>
+
+    <example><title>Reverse Proxy PHP scripts</title>
+    <highlight language="config">
+&lt;FilesMatch \.php$&gt;
+    SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
+&lt;/FilesMatch&lgt;
+    </highlight>
+    </example>
+    </section> <!-- /handler -->
+
 
     <section id="workers"><title>Workers</title>
       <p>The proxy manages the configuration of origin servers and their
index 329e805c069da157c2a4d41f39b07d99c9a3dc63..1c6716b8bbd040673bc099bae37aa002f770604c 100644 (file)
@@ -927,8 +927,25 @@ static int proxy_handler(request_rec *r)
     struct dirconn_entry *list = (struct dirconn_entry *)conf->dirconn->elts;
 
     /* is this for us? */
-    if (!r->proxyreq || !r->filename || strncmp(r->filename, "proxy:", 6) != 0)
+    if (!r->filename) {
+        return DECLINED;
+    }
+
+    if (!r->proxyreq) {
+        /* We may have forced the proxy handler via config or .htaccess */
+        if (r->handler &&
+            strncmp(r->handler, "proxy:", 6) == 0 &&
+            strncmp(r->filename, "proxy:", 6) != 0) {
+            r->proxyreq = PROXYREQ_REVERSE;
+            r->filename = apr_pstrcat(r->pool, r->handler, r->filename, NULL);
+            apr_table_setn(r->notes, "rewrite-proxy", "1");
+        }
+        else {
+            return DECLINED;
+        }
+    } else if (strncmp(r->filename, "proxy:", 6) != 0) {
         return DECLINED;
+    }
 
     /* handle max-forwards / OPTIONS / TRACE */
     if ((str = apr_table_get(r->headers_in, "Max-Forwards"))) {