web-dev-qa-db-ja.com

htaccessのApache 2.4 mod_proxy_fcgiとRewriteRulesを理解する

最近、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ルールが起動しました。

私は困惑しています-原因は何ですか?

9
Konrad Neuwirth

私はこの解決策を見つけました、それが最善の方法かどうかはわかりませんが、私にとってはうまくいきます。

  1. 行を削除します。

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. これをディレクティブに追加します。

    <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構成の間で互換性があることがわかった唯一の方法です。

  3. プロキシに必要な他のパラメータを制御するには:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    
12

ProxyPassMatch.htaccessファイルは無視されます。 here および here の説明に従って、代わりにFilesMatchおよびSetHandlerを使用してみてください。

2
Peter Nowee

書き換えロジックを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
0
Marshall