ProxyPassMatch 和 mod_rewrite 操作顺序

ProxyPassMatch 和 mod_rewrite 操作顺序

我在子文件夹模式下遇到了 Apache 2.4、PHP-FPM 和 Wordpress 多用户的情况。

所有非 *.php 文件在子文件夹中均可正常工作,主 example.com/subblog/ url 也是如此,但是其中带有 .php 的任何文件(例如 example.com/subblog/wp-login.php)都会失败,并出现 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

因此,当 mod_rewrite 应该将 example.com/wp-login.php(存在)更改为 example.com/wp-login.php(存在)时,PHP-FPM 却尝试加载 example.com/subblog/wp-login.php(不存在)。

我读到应该使用 PT 来允许 ProxyPassMatch 拾取重写,但看起来 ProxyPassMatch 仍然在 mod_rewrite 到达之前执行。我打开了 mod_rewrite 调试,但它没有输出 *.php 文件的任何调试信息。

这里的解决方案是什么,可以让它始终在 ProxyPassMatch 之前处理 mod_rewrite 规则?

答案1

找到解决方案。为了使其正常工作,我必须稍微修改一下重写规则,并将其包含在 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]

相关内容