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?
la source
RewriteRule
avec le[P]
drapeau, en dessous des autres règles?Réponses:
J'ai trouvé cette solution, je ne sais pas si c'est la meilleure façon, mais ça marche pour moi.
Supprimez la ligne:
Ajoutez ceci dans votre directive:
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.
Pour contrôler d'autres paramètres dont vous pourriez avoir besoin pour le proxy:
la source
Avec
ProxyPassMatch
, les.htaccess
fichiers sont ignorés. Essayez d'utiliserFilesMatch
et à laSetHandler
place, comme décrit ici et ici .la source
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:
la source