Docker

使用 apache 反向代理將 /blog 的所有請求發送到內部 wordpress 伺服器

  • August 21, 2021

我有一個用 react 編寫的網站,現在我想在網站上添加一個部落格部分。該部落格將基於 wordpress。

react 應用在 docker 容器中執行,我使用 wordpress docker 容器來執行 wordpress 部落格。

為了訪問該網站,我使用另一個執行 apache 並充當反向代理的容器。

httpd.confapache 容器的文件中,我有以下部分:

<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_SERVERBLOG_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 文件應如下所示

&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

這將是存在於 wordpress docker 容器中的 htaccess

引用自:https://serverfault.com/questions/1075200