/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)内で動作することがわかったので、次のようにSetHandlerの代わりにProxyPassを使用できました。
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://localhost:8000/"
</FilesMatch>
<LocationMatch "/admin">
ProxyPass fcgi://localhost:9000/var/www/index.php/
</LocationMatch>
しかし、もともと試みたのはなぜうまくいかなかったのだろうか。 REQUEST_URI は現在実際には存在しないか、他のものを含んでいます。それとも…?