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?
fuente
RewriteRule
con la[P]
bandera, debajo de las otras reglas?Respuestas:
Encontré esta solución, no sé si es la mejor manera, pero funciona para mí.
Eliminar la línea:
Agregue esto en su directiva:
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.
Para controlar otros parámetros que pueda necesitar para el proxy:
fuente
Con
ProxyPassMatch
, los.htaccess
archivos se ignoran. Intente usarFilesMatch
y en suSetHandler
lugar, como se describe aquí y aquí .fuente
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:
fuente