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


9

最近、Webサーバーの1つをApache 2.4に切り替え、php-fpmおよびmod_proxy_fcgiを介してPHPを実行しました。ほとんどすべてが非常にうまく機能していますが、まだ理解していない問題が1つあります。私たちのサイトの1つはWordPressを実行しています。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ルールが起動します。

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


リライトを.htaccessではなくvhostに入れてみましたか?(行う場合は、先頭のスラッシュに注意してください。)
Ladadadada '14

これは一時的な解決策にすぎない可能性があります。書き換えルールを作成するソフトウェアはWordPress自体です。これは、時々ルールを更新するために使用されます(そして、更新の過程で)、それで、ウェブスペースからそれらを完全に隠すことはできません。
Konrad Neuwirth、2012年

@KonradNeuwirth 他のルールの下RewriteRuleで、[P]フラグを使用してを介してプロキシに切り替えると、正しく機能しますか?
シェーンマッデン2012年

回答:


12

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

  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>
    

2

ではProxyPassMatch.htaccessファイルは無視されます。ここここで説明さいるように、FilesMatchおよびを使用してみてください。SetHandler


まったく同じ答えを複数回投稿しないでください。代わりに、該当する場合は、質問を重複として投票/フラグ付けします。
Sven

これは私が探していたものです。htaccessコンテキストでmod_rewriteを使用できます。
David

0

書き換えロジックを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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.