Ordem de operação de ProxyPassMatch e mod_rewrite

1

Eu tenho uma situação com o Apache 2.4, PHP-FPM e Wordpress Multi-usuário no modo de subpasta.

Todos os arquivos não * .php funcionam bem na subpasta, assim como o principal exemplo.com/subblog/ url, no entanto, qualquer coisa com .php, como example.com/subblog/wp-login.php, está falhando com Arquivo não encontrado do PHP-FPM.

O arquivo mod_rewrite é:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [PT]
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [PT]
RewriteRule . index.php [PT]

Que é basicamente o arquivo recomendado, mas com alguns dos [L] substituídos por [PT] para tentar fazê-lo funcionar corretamente.

PHP-FPM é invocado com:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:21358/home/northest/public_html/$1

Então o PHP-FPM está tentando carregar o example.com/subblog/wp-login.php (que não existe) quando o mod_rewrite deve alterá-lo para example.com/wp-login.php (que existe ).

Eu li que o PT deve ser usado para permitir que o ProxyPassMatch escolha a reescrita, mas ainda assim parece que o ProxyPassMatch está sendo executado antes de o mod_rewrite chegar a ele. Liguei a depuração do mod_rewrite e não estava enviando nenhuma informação de depuração para arquivos * .php.

Qual é a solução aqui para fazer com que sempre processe as regras do mod_rewrite antes do ProxyPassMatch?

    
por Nick 24.04.2015 / 09:56

1 resposta

0

Solução encontrada. Para fazê-lo funcionar, tive que modificar um pouco as regras de reconfiguração e incluí-las no arquivo de configuração do Apache, não via .htaccess.

O Apache também começou a tentar reescrever o index.html no final de todas as pastas que precisavam que o DirectoryIndex fosse alterado para que o index.php estivesse no início.

Finalmente, todas as regras de reescrita precisam ser absolutas com DOCUMENT_ROOT adicionadas e reescritas começando com /

DirectoryIndex index.php index.html

RewriteEngine On
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^/[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) /$1 [PT]
RewriteRule ^/[_0-9a-zA-Z-]+/(.*\.php)$ /$1 [PT]
RewriteRule . /index.php [PT]
    
por 27.04.2015 / 05:31