Entendendo o apache 2.4 mod_proxy_fcgi e RewriteRules no htaccess

7

Recentemente, trocamos um dos nossos servidores da web para o apache 2.4 e executamos o PHP via php-fpm e mod_proxy_fcgi. Quase tudo funciona muito bem, mas há um problema que não entendo ainda. Um dos nossos sites está executando o WordPress, que traz uma boa lista de regras de reescrita em seu arquivo .htaccess. E parece que eles 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, entre outras coisas, faz 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, eu li que o URL / blogname/wp-admin/load-styles.php?xxxx deve ser reescrito como wp-admin / load-styles.php? xxx (a segunda reescrita regra). Mas olhando para o log mod_proxy, a requisição passada é na verdade /blogname/wp-admin/load-styles.php.

Eu li isso como se houvesse um problema de precedência - a regra ProxyPass é acionada antes que todos os RewriteRules tenham sido resolvidos.

Estou frustrado - qual pode ser a causa?

    
por Konrad Neuwirth 14.06.2012 / 18:36

3 respostas

11

Eu encontrei esta solução, não sei se é o melhor caminho, mas funciona para mim.

  1. Remova a linha:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Adicione isto à sua diretiva:

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

    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 são aplicadas antes das regras especificadas no escopo filho (.htaccess no diretório). É a única maneira que encontrei para ter compatibilidade entre o fcgi config e o cliente .htaccess config.

  3. Para controlar outros parâmetros que você pode precisar para o proxy:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    
por 08.01.2014 / 20:10
1

Com ProxyPassMatch , .htaccess arquivos são ignorados. Tente usar FilesMatch e SetHandler , conforme descrito aqui e here .

    
por 04.08.2016 / 12:18
0

Mova a lógica de reescrita para as expressões ProxyPassMatch. Adicione duas linhas ProxyPassMatch adicionais antes da configuração vhost da seguinte forma:

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
    
por 12.02.2016 / 23:21