我在子文件夹模式下遇到了 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]