Назад | Перейти на главную страницу

Порядок работы ProxyPassMatch и mod_rewrite

У меня ситуация с пользователем Apache 2.4, PHP-FPM и Wordpress Multi в режиме подпапки.

Все файлы, отличные от * .php, нормально работают в подпапке, как и основной URL-адрес example.com/subblog/, однако все, что содержит .php, например example.com/subblog/wp-login.php, не работает с File Not Found из PHP-FPM.

Файл 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]

Это в основном рекомендуемый файл, но с некоторыми [L] заменены на [PT], чтобы попытаться заставить его работать должным образом.

PHP-FPM вызывается с помощью:

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

Итак, PHP-FPM пытается загрузить example.com/subblog/wp-login.php (которого не существует), когда mod_rewrite должен изменить его на example.com/wp-login.php (который существует).

Я читал, что PT следует использовать, чтобы позволить ProxyPassMatch забрать перезапись, но все еще кажется, что ProxyPassMatch выполняется до того, как mod_rewrite до него доберется. Я включил отладку mod_rewrite, и она не выводила отладочную информацию для файлов * .php.

Какое здесь решение, чтобы он всегда обрабатывал правила mod_rewrite до ProxyPassMatch?

Решение найдено. Чтобы заставить его работать, мне пришлось несколько изменить правила перезаписи и включить их в конфигурационный файл Apache не через .htaccess.

Apache также начал пытаться переписать index.html в конец всех папок, которые требовали изменения DirectoryIndex, чтобы index.php был в начале.

Наконец, все правила перезаписи должны быть абсолютными с добавленным DOCUMENT_ROOT и перезаписаны, начиная с /

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]