将 Apache 变量传递到 SetHandler 指令

将 Apache 变量传递到 SetHandler 指令

我正在努力动态确定的 Unix 套接字用于不同的 PHP “应用程序”(不同的套接字导致不同的PHP-FPM在我的 Apache (2.4.18) 服务器上使用修改代理服务器):

<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>

很遗憾Apache 似乎无法识别/评估该变量由正则表达式匹配定义<DirectoryMatch>指令与设置处理程序指示。

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

如何将变量传递给设置处理程序指示?当我使用到 UDS 的“固定”路径时,我的 PHP-FPM 工作正常(例如"proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001",但在其中使用变量时似乎出现问题。


我还尝试使用连接在一起的几个变量来构建路径:

<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 响应标头http://127.0.0.1/apps/someappname/index.php(正确)包含:HANDLER_PATH: proxy:unix://var/run/app_someappname.sock|fcgi://localhost:42001

但是当我将${final}变量传递给设置处理程序,服务器返回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 (*)

令我印象深刻的是,当将 sock 的路径放入 HTTP 标头时,它被正确解析为 proxy:unix://var/run/app_someappname.sock,但当将变量传递给设置处理程序,它突然变成了unix://var/run/app_%{MATCH_APPNAME}e.sock一个文字%{MATCH_APPNAME}e,就像变量被解析了一样设置处理程序本身(并且不正确)......

我们怎样才能做到这一点?这有可能吗?我认为一定有可能。

答案1

您是否尝试过用[H=而不是RewriteRule SetHandler

RewriteRule 的优点在于它在执行时而不是在启动时评估参数(典型的指令在实际执行时不会插入每个请求的变量)

相关内容