Recentemente, trocamos um de nossos servidores da web para o apache 2.4 e executando o PHP via php-fpm e mod_proxy_fcgi. Quase tudo funciona muito bem, mas há um problema que ainda não entendi. Um de nossos sites está executando o WordPress, que traz uma boa lista de regras de reescrita em seu arquivo .htaccess. E parece que esses não funcionam tão bem com a diretiva ProxyPass na configuração do vhost.
Nosso vhost contém a seguinte configuração:
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
Isso funciona na maioria dos casos.
Agora, o arquivo htaccess faz, entre outras coisas, isso:
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]
Como o site é um multiblog em subdiretórios, li que o URL /blogname/wp-admin/load-styles.php?xxxx deve ser reescrito como wp-admin / load-styles.php? Xxx (a segunda regra de reescrita). Mas olhando para o log mod_proxy, a solicitação que é passada na verdade é /blogname/wp-admin/load-styles.php.
Eu li isso como um problema de precedência - a regra ProxyPass é acionada antes que todas as RewriteRules tenham sido resolvidas.
Estou frustrado - qual pode ser a causa?
fonte
RewriteRule
com a[P]
bandeira, abaixo das outras regras?Respostas:
Encontrei esta solução, não sei se é a melhor maneira, mas funciona para mim.
Remova a linha:
Adicione isso na sua diretiva:
Todos os arquivos php reais serão redirecionados para o proxy fcgi.
E o " RewriteOptions InheritBefore " Isso força a configuração atual a herdar a configuração do pai, mas é aplicada antes das regras especificadas no escopo filho (.htaccess no diretório). É a única maneira que eu encontrei para ter compatibilidade entre a configuração do fcgi e a configuração do cliente .htaccess.
Para controlar outros parâmetros que você pode precisar para o proxy:
fonte
Com
ProxyPassMatch
, os.htaccess
arquivos são ignorados. Tente usarFilesMatch
eSetHandler
, como descrito aqui e aqui .fonte
Mova a lógica de reescrita para as expressões ProxyPassMatch. Adicione duas linhas ProxyPassMatch adicionais antes da linha na sua configuração do vhost da seguinte maneira:
fonte