最近、Webサーバーの1つをApache 2.4に切り替え、PHPを実行しています。ほとんどすべてが正常に動作しますが、まだ理解していない問題が1つあります。 。私たちのサイトの1つはWordPressを実行しており、.htaccessファイルに書き換えルールの優れたリストが含まれていますが、これらはvhostセットアップのProxyPassディレクティブではうまく機能しないようです。
私たちの仮想ホストには次の設定が含まれています:
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
これはほとんどの場合に機能します。
Htaccessファイルは、特に次のことを行います。
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
サイトはサブディレクトリ内のマルチブログなので、URL /blogname/wp-admin/load-styles.php?xxxxをwp-admin/load-styles.php?xxx(2番目の書き換えルール)に書き換える必要があることを読みました。しかし、mod_proxyログを見ると、実際に渡される要求は/blogname/wp-admin/load-styles.phpです。
優先順位の問題があるため、これを読みました。すべてのRewriteRulesが機能しなくなる前に、ProxyPassルールが起動しました。
私は困惑しています-原因は何ですか?
私はこの解決策を見つけました、それが最善の方法かどうかはわかりませんが、私にとってはうまくいきます。
行を削除します。
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
これをディレクティブに追加します。
<Directory /var/www/yoursiste.com>
Options -Indexes +FollowSymLinks -ExecCGI +MultiViews
AllowOverride All
<IfModule mod_proxy_fcgi.c>
RewriteEngine On
RewriteBase /
RewriteOptions InheritBefore
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^([^\.]+\.php)$ fcgi://127.0.0.2:9126/var/www/yoursite.com/$1 [L,P]
</IfModule>
Order allow,deny
allow from all
<IfVersion >= 2.4>
Require all granted
</IfVersion>
</Directory>
実際のすべてのphpファイルはfcgiプロキシにリダイレクトされます。
そして、「 RewriteOptions InheritBefore "これにより、現在の構成は親の構成を継承しますが、子スコープ(ディレクトリの.htaccess)で指定されたルールの前に適用されます。 fcgi構成とクライアントの.htaccess構成の間で互換性があることがわかった唯一の方法です。
プロキシに必要な他のパラメータを制御するには:
<IfModule mod_proxy_fcgi.c>
<Proxy fcgi://127.0.0.2:9126>
ProxySet timeout=1800 disablereuse=on
</Proxy>
</IfModule>
書き換えロジックをProxyPassMatch式に移動します。次のように、vhost構成の行の前に2つの追加のProxyPassMatch行を追加します。
ProxyPassMatch ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes)/.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/<path>/$2
ProxyPassMatch ^/([_0-9a-zA-Z-]+/)?(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/<path>/$2
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/<path>/$1