Apache の ProxyPassMatch は書き換えルールよりも優先されますか?

Apache の ProxyPassMatch は書き換えルールよりも優先されますか?

仮想ホストセクションには次の内容があります:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/local.mysite/wordpress/$1

私のテストでは、 の書き換えルールを追加しても、RewriteRule ^/wordpress/wp-content/(.*)$ /wp-content/$1 [L]次のような URL には効果がないことがわかりました。

http://local.mysite/wordpress/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=....

.phpこれは、名前に含まれるすべてのリクエストが fcgi に渡され、すべての書き換えルールが無視されるためでしょうか?

答え1

proxypassmatch または proxypass を使用すると、php スクリプトが php-fpm プロセスによって処理され、php-fpm プロセスは .htaccess ルールを無視します。これを回避する 1 つの方法は、この回答で説明されているように、apache sethandler を使用することです。https://serverfault.com/a/672969/189511

 <FilesMatch \.php$>
   SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
 </FilesMatch>

完全な解決策をここにコピーします

何時間も検索して Apache のドキュメントを読んだ結果、プールを使用でき、URL に .php ファイルが含まれている場合でも .htaccess の Rewrite ディレクティブが機能するソリューションを思いつきました。

<VirtualHost ...>

 ...

 # This is to forward all PHP to php-fpm.
 <FilesMatch \.php$>
   SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
 </FilesMatch>

 # Set some proxy properties (the string "unique-domain-name-string" should match
 # the one set in the FilesMatch directive.
 <Proxy fcgi://unique-domain-name-string>
   ProxySet connectiontimeout=5 timeout=240
 </Proxy>

 # If the php file doesn't exist, disable the proxy handler.
 # This will allow .htaccess rewrite rules to work and 
 # the client will see the default 404 page of Apache
 RewriteCond %{REQUEST_FILENAME} \.php$
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
 RewriteRule (.*) - [H=text/html]

</VirtualHost>

Apache のドキュメントによると、SetHandler プロキシ パラメータには Apache HTTP Server 2.4.10 が必要です。

この解決策があなたにも役立つことを願っています。

関連情報