有一个通过 /index.php 处理所有请求的站点,我想将大多数请求发送到 PHP-FPM 后端的 HAproxy 平衡池,但我想将某些 URI 单独发送到单个专用池。 URI /admin 将被发送到 /index.php/admin 等。
我想专门将 /api 和 /admin 发送到单独的池,而其他所有内容都发送到平衡池。
我已经尝试过以下操作,但是 REQUEST_URI 行仅在我给它一个实际的现有文件时才匹配(即,如果它是文件系统上的真实文件并且我请求该 URI,我可以匹配 /test.php),而不是能够匹配将发送到 index.php 的位置 - 我尝试使用 =~ 正则表达式和 == 字符串匹配,这是在虚拟主机而不是 .htaccess 中设置的。 Else 部分始终运行而不是 If
<FilesMatch "\.php$">
<If "%{REQUEST_URI} == '/admin'">
SetHandler "proxy:fcgi://localhost:9000/"
</If>
<Else>
SetHandler "proxy:fcgi://localhost:8000/"
</Else>
</FilesMatch>
传递到 PHP 的 REQUEST_URI 看起来是正确的(即,如果请求的路径是 /admin,则调用 /index.php/admin 并且我可以看到 PHP _SERVER 数组中的 REQUEST_URI 是 /admin),但这可能不是真正正确的此时在 FilesMatch 中?
我最初尝试在 Location 内部使用 SetHandler 但这似乎不起作用,或者至少 FilesMatch 覆盖了它。也无法在位置内使用文件(匹配)...
编辑:
我发现 ProxyPass 在 Location(Match) 内部工作,因此我能够使用 ProxyPass 而不是 SetHandler,如下所示:
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://localhost:8000/"
</FilesMatch>
<LocationMatch "/admin">
ProxyPass fcgi://localhost:9000/var/www/index.php/
</LocationMatch>
但是,我还是想知道为什么我原来尝试的方法不起作用。 REQUEST_URI 此时实际上并不存在,或者包含其他内容,或者......?