¿ProxyPassMatch de Apache triunfa sobre las reglas de reescritura?

¿ProxyPassMatch de Apache triunfa sobre las reglas de reescritura?

Tengo lo siguiente en una sección de virtualhost:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/local.mysite/wordpress/$1

En mis pruebas, descubrí que agregar una regla de reescritura RewriteRule ^/wordpress/wp-content/(.*)$ /wp-content/$1 [L]no tenía ningún efecto para una URL como:

http://local.mysite/wordpress/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=....

¿Esto se debe a que todas las solicitudes que contienen .phpel nombre se pasan a fcgi y, por lo tanto, se ignoran todas las reglas de reescritura?

Respuesta1

Si utiliza proxypassmatch o proxypass, pasa el script php para que lo procese el proceso php-fpm y el proceso php-fpm ignora las reglas .htaccess. Una forma de evitarlo es usar Apache Sethandler como se explica en esta respuesta.https://serverfault.com/a/672969/189511,

 <FilesMatch \.php$>
   SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
 </FilesMatch>

Copiaré la solución completa aquí.

Después de horas de buscar y leer la documentación de Apache, se me ocurrió una solución que permite usar el grupo y también permite que la directiva Rewrite en .htaccess funcione incluso cuando la URL contiene archivos .php.

<VirtualHost ...>

 ...

 # This is to forward all PHP to php-fpm.
 <FilesMatch \.php$>
   SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
 </FilesMatch>

 # Set some proxy properties (the string "unique-domain-name-string" should match
 # the one set in the FilesMatch directive.
 <Proxy fcgi://unique-domain-name-string>
   ProxySet connectiontimeout=5 timeout=240
 </Proxy>

 # If the php file doesn't exist, disable the proxy handler.
 # This will allow .htaccess rewrite rules to work and 
 # the client will see the default 404 page of Apache
 RewriteCond %{REQUEST_FILENAME} \.php$
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
 RewriteRule (.*) - [H=text/html]

</VirtualHost>

Según la documentación de Apache, el parámetro de proxy SetHandler requiere el servidor HTTP Apache 2.4.10.

Espero que esta solución también te ayude.

información relacionada