Apache-2.2

使用 Apache 將子目錄反向代理到子目錄

  • August 5, 2014

我理解概念上的代理(儘管從未設置過)。我正在嘗試代理 Drupal,但我相當確定我的問題與 Drupal 無關。由於我從今天早上開始就一直在嘗試確定使這項工作發揮作用的神奇成分,因此我將開始著手:

環境

我有兩台伺服器,如下所述。兩者都可以公開訪問,但是需要從代理伺服器訪問 drupal 站點的某些部分——特別是需要登錄的內容。

代理伺服器 (c5.domain.com)

  • c5.domain.com 是一個 Concrete5 站點,這意味著會有與之關聯的 cookie。如果可能的話,我想避免 cookie 衝突造成的“碎屑後果”(不確定這是否是一個問題)。
  • http://c5.domain.com/my-account/應該代理http://drupal.domain.com/proxy/
  • http://c5.domain.com/my-account/login是登錄頁面的 url(http://drupal.domain.com/proxy/login在 drupal 上)

Drupal 伺服器 (drupal.domain.com)

  • 非常標準的網站,帶有大量令人討厭的重定向。重定向似乎需要RewriteRule繞過。

什麼有效(但不是我需要的)

雖然這允許對 drupal 站點的完全訪問,包括登錄的能力,但這具有阻止訪問具體站點的明顯且不幸的副作用。

ProxyPass         /        http://drupal.domain.com/
ProxyPassReverse  /        http://drupal.domain.com/
ProxyPassReverseCookieDomain   c5.domain.com    drupal.domain.com

我現在正在嘗試什麼

通過以下設置,我可以使用 url 訪問 drupal 頁面http://c5.domain.com/my-account/...,但我無法登錄 - 嘗試這樣做會將我重新路由到http://c5.domain.com/proxy/(重定向到 /my-account/)

阿帕奇

<Location /my-account/>
   ProxyPass http://drupal.domain.com/proxy/
   ProxyPassReverse http://drupal.domain.com/proxy/
   ProxyPassReverseCookieDomain drupal.domain.com c5.domain.com
   # the cookie path seems important...
   ProxyPassReverseCookiePath / /my-account/
</Location>

# These rules seem necessary, since drupal's mod-alias seems to
# feed the browser a path like `https://c5.domain.com/proxy/...`
RewriteRule ^/proxy/(.*)$ /my-account/$1 [R,L]
RewriteRule ^/my-account/proxy/(.*)$ /my-account/$1 [R,L]

Drupal 配置

在這裡,我嘗試讓 Drupal 與代理伺服器配合得很好:

if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) &&
   'drupal.domain.com' === $_SERVER['HTTP_X_FORWARDED_HOST']
) {
 $base_url = "$protocol://{$_SERVER['HTTP_X_FORWARDED_HOST']}/proxy";
 $cookie_domain = '.drupal.domain.com';
 $conf['reverse_proxy'] = TRUE;
 $conf['reverse_proxy_addresses'] = array('55.55.55.55',);
} else {
 $base_url = "$protocol://{$_SERVER['SERVER_NAME']}";
}

問題:

登錄表單發佈到 URL Drupal 知道:/proxy. 這意味著代理伺服器收到的請求是http://c5.domain.com/proxy,而不是http://c5.domain.com/my-account。我想我可以通過重定向來解決這個問題:

RewriteRule ^/proxy/(.*)$ /my-account/$1 [R,L]
RewriteRule ^/my-account/proxy/(.*)$ /my-account/$1 [R,L]

事實證明,大多數重定向都不會轉發 POST 數據。

一個辦法:

此規則有一個例外:307 將轉發 POST 數據。像這樣的工作:

RewriteRule ^/proxy/(.*)$ /my-account/$1 [R=307,L]
RewriteRule ^/my-account/proxy/(.*)$ /my-account/$1 [R=307,L]

一個警告:

當然,這種解決方案也不是沒有優點和缺點。大多數瀏覽器會通知使用者重定向(適當地,因為 POST 數據可以發送到任何地方)並詢問使用者他們是否打算將數據發送到新 URL。由於很少有使用者可能理解該通知,因此此選項可能會導致混淆。

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