Apache 不遵守 Wordpress 的 htaccess 规则

Apache 不遵守 Wordpress 的 htaccess 规则

首先,我在这里发帖的原因是,我认为这可能是因为我已为本地环境设置了一些东西,这就是我在这里发帖而不是在 wordpress.stackexchange.com 发帖的原因。

其次,实际问题:

我正在尝试为 Wordpress 设置多站点子目录安装。我拥有的 htaccess 文件是其 codex 网站上的文件:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [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).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

目前为止,当前网站一切正常。所有管理页面均能正常工作。所有前端页面均能使用漂亮的 URL。一切正常.htaccess

现在,当我添加新网站时,我会访问其管理仪表板区域,这时就会出错。任何具有此模式的 URLhttp://website.com/[site-name]/wp-admin/[page].php都会返回 404 错误,通常显示“文件未找到”消息。

这很奇怪,因为 Wordpress 通常根据 htaccess 文件知道此时该做什么。

因此,仅当文件存在时,此规则才会运行:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

因此,如果文件不存在,则检查后面的规则,如果匹配则运行

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]

例如:此 URLhttp://website.com/my-site/wp-admin/settings.php应重写为http://website.com/wp-admin/settings.php文件确实存在的 URL。但是,尽管重写规则适用于与 Wordpress 相关的所有其他内容,但似乎并没有发生这种情况。它似乎只是失败了,而实际上并不关心其他任何事情。

问题

为什么会失败?我还能在哪里测试以调试此问题?

一些系统/环境信息:

OS: MacOS - Sierra
Apache: Apache/2.4.27 (Unix)
PHP: Served through fcgi proxy

需要注意的一点是,我最近确实更新到了 Sierra,但我无法确认此设置在更新之前是否正常工作。

更新

我在错误日志中添加了重写日志。当我访问类似这样的文件夹 URL 时:http://website.com/does/not/exist我获得了所有模式 mod_rewrite 测试的日志历史记录,其中显示对 index.php 文件进行了重写,Wordpress 在该文件中出现 404 错误。所以这按预期工作。

当我再次访问此 URL 时,http://website.com/new-site/wp-admin/settings.php页面上出现 404 错误,并显示“文件未找到”,但.....它没有记录。因此,我假设 Apache 在到达包含所有 mod_rewrite 内容的 htaccess 之前返回了 404 错误。

重要的提示 我想重申一下,htaccess 是有效的。apache 在 404 错误到达 htaccess 文件之前提供该错误的唯一情况是当我使用带有文件扩展名的 URL 时。所以我觉得 apache 在 htaccess 有机会重写任何内容之前,先使用其他东西来提前处理 404。这就是为什么日志在任何其他情况下都有效,但对于像 这样的 URL 却无效的原因http://website.com/my-site/wp-admin/settings.php

我已经检查了该http.conf文件,但似乎没有什么明显迹象表明可以解决文件未找到的问题。

更新时间 2018-02-11

好吧,我想我发现了一些问题。这可能与我在虚拟主机配置中设置的 ProxyPassMatch 条件有关。该文件的内容如下:

<VirtualHost *:*>
    ServerName wp-test.test
    DocumentRoot "/Users/joemoe-mac/Sites/wp-test.test/public"
    ErrorLog "/Users/joemoe-mac/Sites/wp-test.test/logs/errors.log"

    LogLevel debug

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/$
</VirtualHost>

现在我一直在使用 curl 命令发出请求,以保持日志输出简单。我将在主网站上测试 load-scripts.php 文件,该文件http://wp-test.test/wp-admin/load-scripts.php按预期运行,然后我将在 测试失败的文件http://wp-test.test/testing/wp-admin/load-scripts.php

testing在此示例中是子站点的名称。下面是每个站点的日志:

http://wp-test.test/wp-admin/load-scripts.php

[authz_core:debug] [pid 14276] mod_authz_core.c(834): [client 127.0.0.1:50972] AH01628: authorization result: granted (no directives)
[proxy_fcgi:debug] [pid 14276] mod_proxy_fcgi.c(108): [client 127.0.0.1:50972] AH01060: set r->filename to proxy:fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/wp-admin/load-scripts.php
[proxy:debug] [pid 14276] mod_proxy.c(1226): [client 127.0.0.1:50972] AH01143: Running scheme fcgi handler (attempt 0)
[proxy_fcgi:debug] [pid 14276] mod_proxy_fcgi.c(993): [client 127.0.0.1:50972] AH01076: url: fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/wp-admin/load-scripts.php proxyname: (null) proxyport: 0
[proxy_fcgi:debug] [pid 14276] mod_proxy_fcgi.c(1002): [client 127.0.0.1:50972] AH01078: serving URL fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/wp-admin/load-scripts.php
[proxy:debug] [pid 14276] proxy_util.c(2154): AH00942: FCGI: has acquired connection for (*)
[proxy:debug] [pid 14276] proxy_util.c(2208): [client 127.0.0.1:50972] AH00944: connecting fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/wp-admin/load-scripts.php to 127.0.0.1:9056
[proxy:debug] [pid 14276] proxy_util.c(2417): [client 127.0.0.1:50972] AH00947: connected /Users/joemoe-mac/Sites/wp-test.test/public/wp-admin/load-scripts.php to 127.0.0.1:9056
[proxy:debug] [pid 14276] proxy_util.c(2883): AH02824: FCGI: connection established with 127.0.0.1:9056 (*)
[proxy:debug] [pid 14276] proxy_util.c(2169): AH00943: FCGI: has released connection for (*)

http://wp-test.test/testing/wp-admin/load-scripts.php

[authz_core:debug] [pid 14220] mod_authz_core.c(834): [client 127.0.0.1:64869] AH01628: authorization result: granted (no directives)
[proxy_fcgi:debug] [pid 14220] mod_proxy_fcgi.c(108): [client 127.0.0.1:64869] AH01060: set r->filename to proxy:fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/testing/wp-admin/load-scripts.php
[proxy:debug] [pid 14220] mod_proxy.c(1226): [client 127.0.0.1:64869] AH01143: Running scheme fcgi handler (attempt 0)
[proxy_fcgi:debug] [pid 14220] mod_proxy_fcgi.c(993): [client 127.0.0.1:64869] AH01076: url: fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/testing/wp-admin/load-scripts.php proxyname: (null) proxyport: 0
[proxy_fcgi:debug] [pid 14220] mod_proxy_fcgi.c(1002): [client 127.0.0.1:64869] AH01078: serving URL fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/testing/wp-admin/load-scripts.php
[proxy:debug] [pid 14220] proxy_util.c(2154): AH00942: FCGI: has acquired connection for (*)
[proxy:debug] [pid 14220] proxy_util.c(2208): [client 127.0.0.1:64869] AH00944: connecting fcgi://127.0.0.1:9056/Users/joemoe-mac/Sites/wp-test.test/public/testing/wp-admin/load-scripts.php to 127.0.0.1:9056
[proxy:debug] [pid 14220] proxy_util.c(2417): [client 127.0.0.1:64869] AH00947: connected /Users/joemoe-mac/Sites/wp-test.test/public/testing/wp-admin/load-scripts.php to 127.0.0.1:9056
[proxy:debug] [pid 14220] proxy_util.c(2883): AH02824: FCGI: connection established with 127.0.0.1:9056 (*)
[proxy_fcgi:error] [pid 14220] [client 127.0.0.1:64869] AH01071: Got error 'Primary script unknown\n'
[proxy:debug] [pid 14220] proxy_util.c(2169): AH00943: FCGI: has released connection for (*)

对于有问题的 URL,日志中似乎始终显示此行:

[proxy_fcgi:错误] [pid 14220] [客户端 127.0.0.1:64869] AH01071:出现错误“主脚本未知\n”

因此,每次 ProxyPassMatch 尝试匹配不存在的文件时,我都会收到“文件未找到”错误。它尝试映射到此位置:/Users/joemoe-mac/Sites/wp-test.test/public/testing/wp-admin/load-scripts.php当文件位于此处/Users/joemoe-mac/Sites/wp-test.test/public/wp-admin/load-scripts.php而没有测试文件夹时(因为子站点与主站点共享相同的文件)

我想我的下一个问题是如何使用 Wordpress 子目录多站点正确设置代理?

答案1

是的,看看你的 ApacheVirtualHost ProxyPassMatch配置。这里是一个配置示例。

如果通过 https 反向代理为 WordPress 提供服务,你可能还需要注意

答案2

在 Apache 配置文件中,您必须具有:

AllowOverride All

该文档的根目录。

默认大概是:AllowOverride None

相关内容