Comprendre apache 2.4 mod_proxy_fcgi et RewriteRules dans htaccess

9

Nous avons récemment basculé l'un de nos serveurs Web vers Apache 2.4 et exécuté PHP via php-fpm et mod_proxy_fcgi. Presque tout fonctionne assez bien, mais il y a un problème que je ne comprends pas encore. L'un de nos sites exécute WordPress, qui apporte une bonne liste de règles de réécriture dans son fichier .htaccess. Et il semble que ceux-ci ne fonctionnent pas si bien avec la directive ProxyPass dans la configuration de vhost.

Notre vhost contient la configuration suivante:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1

Cela fonctionne dans la plupart des cas.

Maintenant, le fichier htaccess fait, entre autres, ceci:

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]

Comme le site est un multiblog dans des sous-répertoires, j'ai lu que l'URL /blogname/wp-admin/load-styles.php?xxxx devrait être réécrite en wp-admin / load-styles.php? Xxx (la deuxième règle de réécriture). Mais en regardant le journal mod_proxy, la demande qui est passée est en fait /blogname/wp-admin/load-styles.php.

J'ai lu cela comme un problème de priorité - la règle ProxyPass se déclenche avant que toutes les règles de réécriture aient été résolues.

Je suis bloqué - quelle peut être la cause?

Konrad Neuwirth
la source
Avez-vous essayé de mettre les réécritures dans le vhost plutôt que dans le .htaccess? (Assurez-vous de prendre soin de la barre oblique principale si vous le faites.)
Ladadadada
Cela ne peut être qu'une solution provisoire: le logiciel qui écrit les règles de réécriture est WordPress lui-même. Il est utilisé pour mettre à jour les règles de temps en temps (et que ce soit en cours de mise à jour), donc je ne peux pas les cacher totalement de l'espace Web.
Konrad Neuwirth
@KonradNeuwirth Cela fonctionne-t-il correctement lorsque vous passez au proxy via un RewriteRuleavec le [P]drapeau, en dessous des autres règles?
Shane Madden

Réponses:

12

J'ai trouvé cette solution, je ne sais pas si c'est la meilleure façon, mais ça marche pour moi.

  1. Supprimez la ligne:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Ajoutez ceci dans votre directive:

    <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>
    

    Tous les vrais fichiers php seront redirigés vers le proxy fcgi.

    Et le " RewriteOptions InheritBefore " Cela force la configuration actuelle à hériter de la configuration du parent, mais est appliqué avant les règles spécifiées dans la portée enfant (.htaccess dans le répertoire). Est la seule façon dont j'ai trouvé la compatibilité entre la configuration fcgi et la configuration client .htaccess.

  3. Pour contrôler d'autres paramètres dont vous pourriez avoir besoin pour le proxy:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    
Gabriel Pérez S.
la source
2

Avec ProxyPassMatch, les .htaccessfichiers sont ignorés. Essayez d'utiliser FilesMatchet à la SetHandlerplace, comme décrit ici et ici .

Peter Nowee
la source
Veuillez ne pas publier la même réponse plusieurs fois. Au lieu de cela, le cas échéant, votez / signalez les questions en double.
Sven
C'est ce que je cherchais. Il permet d'utiliser mod_rewrite dans le contexte htaccess.
David
0

Déplacez la logique de réécriture dans les expressions ProxyPassMatch. Ajoutez deux lignes ProxyPassMatch supplémentaires avant celle de votre configuration vhost comme suit:

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
Marshall
la source