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
做它的事情也是如此。現在,當我添加一個新站點時,我會訪問它的管理儀表板區域,這就是問題所在。任何屬於這種模式
http://website.com/[site-name]/wp-admin/[page].php
的 url 通常都會返回 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]
例如:這個 url
http://website.com/my-site/wp-admin/settings.php
應該重寫到http://website.com/wp-admin/settings.php
文件確實存在的地方。但是,儘管重寫規則適用於與 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 測試的日誌歷史記錄,這表明 wordpress 提供 404 錯誤的 index.php 文件被重寫。所以這是按預期工作的。當我再次訪問此 url 時,
http://website.com/new-site/wp-admin/settings.php
我在頁面上收到 404 錯誤,並顯示“找不到文件”但……它沒有記錄。所以我假設 Apache 在到達 htaccess 之前返回了 404 錯誤,其中包含所有 mod_rewrite 內容。重要說明 我想重申 htaccess 正在工作。apache 在到達 htaccess 文件之前提供 404 錯誤的唯一情況是當我使用具有文件副檔名的 url 時。所以我覺得 apache 在 htaccess 有機會重寫任何東西之前,首先使用其他東西來提前處理 404。因此,為什麼日誌在任何其他情況下都有效,但不適用於
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:error $$ $$ pid 14220 $$ $$ client 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 子目錄多站點正確設置代理?
是的,看看你的 Apache
VirtualHost
ProxyPassMatch
配置。這是一個配置範例。如果通過使用 https 的反向代理服務 WordPress,您可能需要額外處理這個問題。
在 Apache 配置文件中,您必須具有:
AllowOverride All
對於該文件根。
預設情況下可能是: AllowOverride None