O ProxyPassMatch do Apache supera as regras de reescrita?

O ProxyPassMatch do Apache supera as regras de reescrita?

Eu tenho o seguinte em uma seção virtualhost:

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

Em meus testes, descobri que adicionar uma regra de reescrita RewriteRule ^/wordpress/wp-content/(.*)$ /wp-content/$1 [L]não teve efeito para um URL como:

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

Isso ocorre porque todas as solicitações contidas .phpno nome são passadas para fcgi e, portanto, todas as regras de reescrita são ignoradas?

Responder1

Se você usar proxypassmatch ou proxypass, ele passa o script php para ser processado pelo processo php-fpm e o processo php-fpm ignora as regras .htaccess. Uma maneira de evitá-lo é usar o apache sethandler conforme explicado nesta respostahttps://serverfault.com/a/672969/189511,

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

Vou copiar a solução completa aqui

Depois de horas pesquisando e lendo a documentação do Apache, descobri uma solução que permite usar o pool e também permitir que a diretiva Rewrite em .htaccess funcione mesmo quando o URL contém arquivos .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>

De acordo com a documentação do Apache, o parâmetro proxy SetHandler requer Apache HTTP Server 2.4.10.

Espero que esta solução ajude você também.

informação relacionada