Comprender apache 2.4 mod_proxy_fcgi y RewriteRules en htaccess


9

Recientemente cambiamos uno de nuestros servidores web a Apache 2.4 y ejecutamos PHP a través de php-fpm y mod_proxy_fcgi. Casi todo funciona bastante bien, pero hay un problema que aún no entiendo. Uno de nuestros sitios ejecuta WordPress, que trae una buena lista de reglas de reescritura en su archivo .htaccess. Y parece que esos no funcionan tan bien con la directiva ProxyPass en la configuración de vhost.

Nuestro vhost contiene la siguiente configuración:

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

Esto funciona en la mayoría de los casos.

Ahora, el archivo htaccess hace, entre otras cosas, esto:

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 el sitio es un multiblog en subdirectorios, leí que la URL /blogname/wp-admin/load-styles.php?xxxx debería reescribirse como wp-admin / load-styles.php? Xxx (la segunda regla de reescritura). Pero mirando el registro mod_proxy, la solicitud que se pasa realmente es /blogname/wp-admin/load-styles.php.

Leí esto porque hay un problema de precedencia: la regla ProxyPass se dispara antes de que todas las RewriteRules hayan sido resueltas.

Estoy bloqueado, ¿cuál puede ser la causa?


¿Has intentado poner las reescrituras en el vhost en lugar de en el .htaccess? (Asegúrate de cuidar la barra diagonal si lo haces).
Ladadadada

Esto solo podría ser una solución provisional: el software que escribe las reglas de reescritura es el propio WordPress. Se utiliza para actualizar las reglas de vez en cuando (y en el proceso de una actualización), por lo que no puedo ocultarlas por completo del espacio web.
Konrad Neuwirth

@KonradNeuwirth ¿Funciona correctamente cuando cambias a proxy mediante a RewriteRulecon la [P]bandera, debajo de las otras reglas?
Shane Madden

Respuestas:


12

Encontré esta solución, no sé si es la mejor manera, pero funciona para mí.

  1. Eliminar la línea:

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.2:9126/<path>/$1
    
  2. Agregue esto en su directiva:

    <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 los archivos php reales redirigirán al proxy fcgi.

    Y el " RewriteOptions InheritBefore " Esto obliga a la configuración actual a heredar la configuración del padre, pero se aplica antes de las reglas especificadas en el ámbito secundario (.htaccess en el directorio). Es la única forma en que encontré que tiene compatibilidad entre la configuración de fcgi y la configuración del cliente .htaccess.

  3. Para controlar otros parámetros que pueda necesitar para el proxy:

    <IfModule mod_proxy_fcgi.c>
        <Proxy fcgi://127.0.0.2:9126>
            ProxySet timeout=1800 disablereuse=on
        </Proxy>
    </IfModule>
    

2

Con ProxyPassMatch, los .htaccessarchivos se ignoran. Intente usar FilesMatchy en su SetHandlerlugar, como se describe aquí y aquí .


No publique la misma respuesta exacta varias veces. En su lugar, cuando corresponda, vote / marque las preguntas como duplicadas.
Sven

Esto es lo que estaba buscando. Permite usar mod_rewrite en el contexto htaccess.
David

0

Mueva la lógica de reescritura a las expresiones ProxyPassMatch. Agregue dos líneas adicionales de ProxyPassMatch antes de la de su configuración de vhost de la siguiente manera:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.