On Fri, Aug 2, 2024 at 12:18 AM Yann Ylavic <ylavic....@gmail.com> wrote:
>
> So we probably should keep encoding r->filename with ProxyPass, and
> come back to my previous patch which skipped it only for SetHandler?
> Possibly FCGI_MAY_BE_FPM() only too because for "ProxyFCGIBackendType
> GENERIC" we don't send the "proxy:scheme://host" part and
> SCRIPT_NAME/FILENAME are supposed to be the real decoded paths?

So I did this in r1919629.

>
> But it's going to be an endless issue if we can't fix or align
> ProxyPass and SetHandler because of workarounds there, we have to
> remain bug compatible..

For this how about this attached patch?
With it I can get the correct env vars (I think), and since we'd not
send a "proxy:" SCRIPT_FILENAME anymore, php-fpm would not flag
"apache_was_there" and work straight with the raw vars? I'm probably
having a sweet dream :)
Just in case..
Index: modules/proxy/mod_proxy_fcgi.c
===================================================================
--- modules/proxy/mod_proxy_fcgi.c	(revision 1919623)
+++ modules/proxy/mod_proxy_fcgi.c	(working copy)
@@ -29,6 +29,7 @@ typedef struct {
 
 typedef struct {
     int need_dirwalk;
+    char *filename;
 } fcgi_req_config_t;
 
 /* We will assume FPM, but still differentiate */
@@ -119,8 +142,10 @@ static int proxy_fcgi_canon(request_rec *r, char *
         rconf = apr_pcalloc(r->pool, sizeof(fcgi_req_config_t));
         ap_set_module_config(r->request_config, &proxy_fcgi_module, rconf);
     }
+    rconf->filename = apr_pstrcat(r->pool, "/", url, NULL);
 
-    if (NULL != (pathinfo_type = apr_table_get(r->subprocess_env, "proxy-fcgi-pathinfo"))) {
+    pathinfo_type = apr_table_get(r->subprocess_env, "proxy-fcgi-pathinfo");
+    if (pathinfo_type) {
         /* It has to be on disk for this to work */
         if (!strcasecmp(pathinfo_type, "full")) {
             rconf->need_dirwalk = 1;
@@ -159,6 +184,9 @@ static int proxy_fcgi_canon(request_rec *r, char *
                     "set r->path_info to %s", r->path_info);
         }
     }
+    else if (FCGI_MAY_BE_FPM(dconf) && !from_handler) {
+        rconf->need_dirwalk = 1;
+    }
 
     return OK;
 }
@@ -337,12 +365,17 @@ static apr_status_t send_environment(proxy_conn_re
     int next_elem, starting_elem;
     fcgi_req_config_t *rconf = ap_get_module_config(r->request_config, &proxy_fcgi_module);
     fcgi_dirconf_t *dconf = ap_get_module_config(r->per_dir_config, &proxy_fcgi_module);
+    char *saved_filename = r->filename;
 
-    if (rconf && rconf->need_dirwalk) {
-        char *saved_filename = r->filename;
-        r->filename = r->uri;
-        ap_directory_walk(r);
-        r->filename = saved_filename;
+    if (rconf) {
+        if (rconf->filename) {
+            r->filename = rconf->filename;
+        }
+        if (rconf->need_dirwalk) {
+            r->proxyreq = PROXYREQ_NONE;
+            ap_core_translate(r);
+            ap_directory_walk(r);
+        }
     }
 
     /* Strip proxy: prefixes */
@@ -379,6 +412,9 @@ static apr_status_t send_environment(proxy_conn_re
     ap_add_common_vars(r);
     ap_add_cgi_vars(r);
 
+    r->filename = saved_filename;
+    r->proxyreq = PROXYREQ_REVERSE;
+
     /* XXX are there any FastCGI specific env vars we need to send? */
 
     /* Give admins final option to fine-tune env vars */

Reply via email to