使用 apache 反向代理將 /blog 的所有請求發送到內部 wordpress 伺服器
我有一個用 react 編寫的網站,現在我想在網站上添加一個部落格部分。該部落格將基於 wordpress。
react 應用在 docker 容器中執行,我使用 wordpress docker 容器來執行 wordpress 部落格。
為了訪問該網站,我使用另一個執行 apache 並充當反向代理的容器。
在
httpd.conf
apache 容器的文件中,我有以下部分:<VirtualHost *:80> <Location "/"> ProxyPreserveHost On ProxyPass "${REACT_SERVER}/" ProxyPassReverse "${REACT_SERVER}/" </Location> <Location /blog> ProxyPreserveHost On ProxyPass "${BLOG_SERVER}/" ProxyPassReverse "${BLOG_SERVER}/" ProxyPassReverseCookiePath "/" "/blog" </Location> # more config for handling websockets </VirtualHost>
變數
REACT_SERVER
和BLOG_SERVER
來自環境。我遇到的問題是,當我嘗試訪問部落格時,apache 成功地將我的請求重定向到內部 wordpress 站點,但是當 wordpress 進行自己的重定向時,它使用與 apache 相同的主機,但路徑不以
/blog
,所以我的反應應用程序嘗試處理請求,但最終放棄並自己重定向到首頁。這是一個使用範例
curl
:➜ curl -v http://localhost:3005/blog/ * Trying 127.0.0.1:3005... * Connected to localhost (127.0.0.1) port 3005 (#0) > GET /blog/ HTTP/1.1 > Host: localhost:3005 > User-Agent: curl/7.74.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 302 Found < Date: Fri, 20 Aug 2021 16:27:32 GMT < Server: Apache/2.4.48 (Debian) < X-Powered-By: PHP/7.4.22 < Expires: Wed, 11 Jan 1984 05:00:00 GMT < Cache-Control: no-cache, must-revalidate, max-age=0 < X-Redirect-By: WordPress < Location: http://localhost:3005/wp-admin/install.php < Content-Length: 0 < Content-Type: text/html; charset=UTF-8 < * Connection #0 to host localhost left intact
如您所見,在該
X-Redirected-By
部分之後,Location
以/wp-admin
代替開頭/blog/wp-admin
。從上的文件
ProxyPassReverse
:例如,假設本地伺服器的地址為http://example.com/;然後
ProxyPass "/mirror/foo/" "http://backend.example.com/" ProxyPassReverse "/mirror/foo/" "http://backend.example.com/" ProxyPassReverseCookieDomain "backend.example.com" "public.example.com" ProxyPassReverseCookiePath "/" "/mirror/foo/"
不僅會導致對 http://example.com/mirror/foo/bar>的本地請求在內部轉換為對<http://backend.example.com/bar的代理請求(ProxyPass 在此處提供的功能) . 它還負責在將 http://backend.example.com/bar>重定向到<http://backend.example.com/quux時伺服器 backend.example.com 發送的重定向。Apache httpd在將 HTTP 重定向響應轉發到客戶端之前將其調整為http://example.com/mirror/foo/quux 。請注意,用於建構 URL 的主機名是根據 UseCanonicalName 指令的設置選擇的。
似乎這就是它工作所需要的全部,但它仍然沒有。
如果您想知道,是的,我已經嘗試過普通的(沒有
Location
指令):ProxyPass "/blog/" "${BLOG_SERVER}/" ProxyPassReverse "/blog/" "${BLOG_SERVER}/" ProxyPassReverseCookiePath "/" "/blog" # etc...
我也得到了同樣的結果。
我錯過了什麼?
這個問題看起來更像是 Wordpress 的問題,而不是配置錯誤。您需要告訴 wordpress 它位於子目錄中,因為現在預設的 wordpress .htaccess 文件會將您重定向到 http://localhost:3005/wp-admin/install.php ,因為它不知道它位於目錄中叫部落格。
選項 1. 嘗試解決此問題的一種方法是告訴 wordpress 它在 wp-config.php 文件中有一個新的基本 url
define('WP_HOME','http://example.com/blog'); define('WP_SITEURL','http://example.com/blog');
選項 2. 另一種嘗試處理此問題的方法是編輯 wordpress 的 htaccess 文件
您在 wordpress 中的 htaccess 文件應如下所示
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /blog/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blog/index.php [L]
這將是存在於 wordpress docker 容器中的 htaccess