将Apachevariables传递给SetHandler指令

我试图在我的Apache(2.4.18)服务器(使用mod_proxy_fcgi )上dynamic确定用于不同分离的PHP“apps”(不同的套接字导致不同的PHP-FPM池)的Unix套接字

<DirectoryMatch "/home/apps/app_(?<appname>[a-zA-Z]+)"> <FilesMatch \.php$> SetHandler "proxy:unix://var/run/app_%{env:MATCH_APPNAME}.sock|fcgi://localhost:42001" </FilesMatch> </DirectoryMatch> 

不幸的是, ApacheSetHandler指令一起使用时, 似乎无法识别/评估 <DirectoryMatch>指令中由正则expression式匹配定义的variables

error.log说:

 [proxy:error] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed 

如何将一个variables传递给SetHandler指令? 当我使用UDS的“刚性”path(例如"proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001" ,我的PHP-FPM正常工作,但似乎有在它使用一个variables时出现问题。


我也尝试使用几个variables连接在一起来构buildpath:

 <FilesMatch \.php$> Define one "proxy:unix://var/run/app_" Define two ".sock|fcgi://localhost:42001" Define final ${one}%{MATCH_APPNAME}e${two} Header set HANDLER_PATH ${final} </FilesMatch> 

在这种情况下,PHP源代码不会被PHP处理,但URL http://127.0.0.1/apps/someappname/index.php (正确)的HTTP响应头包含: HANDLER_PATH: proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001

但是,当我将${final}variables传递给SetHandler时 ,服务器返回503 Service Unavailableerror.log表示:

 *: using default reverse proxy worker for unix://var/run/app_%{MATCH_APPNAME}e.sock|fcgi://localhost:42001/home/apps/app_someappname/www/index.php (no keepalive) *: rewrite of url due to UDS(/run/app_%{MATCH_APPNAME}e.sock): fcgi://localhost:42001/home/apps/app_someappname/www/index.php (proxy:fcgi://localhost:42001/home/apps/app_someappname/www/index.php) AH01143: Running scheme unix handler (attempt 0) AH01076: url: fcgi://localhost:42001/home/apps/app_someappname/www/index.php proxyname: (null) proxyport: 0 AH01078: serving URL fcgi://localhost:42001/home/apps/app_someappname/www/index.php AH00942: FCGI: has acquired connection for (*) AH00944: connecting fcgi://localhost:42001/home/apps/app_someappname/www/index.php to localhost:42001 AH02545: fcgi: has determined UDS as /run/app_%{MATCH_APPNAME}e.sock AH00947: connected /home/apps/app_someappname/www/index.php to httpd-UDS:0 (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/app_%{MATCH_APPNAME}e.sock (*) failed AH01079: failed to make connection to backend: httpd-UDS proxy_util.c(2175): AH00943: FCGI: has released connection for (*) 

什么打击我的是,当袜子的path被放入到HTTP头,它正确parsing为proxy:unix://var/run/app_someappname.sock ,但是当variables传递给SetHandler ,它突然变成了unix://var/run/app_%{MATCH_APPNAME}e.sock与文字%{MATCH_APPNAME}e ,就像如果该variables已由SetHandler本身解决(和不正确)…

如何做到这一点? 这甚至有可能吗? 我认为这一定是。

你有没有尝试与[H=而不是SetHandler RewriteRule?

RewriteRule在执行的时候会比在启动的时候评估参数有好处(典型的指令在实际执行的时候并不插入每个请求variables)