使用 Apache 将子目录反向代理到子目录

使用 Apache 将子目录反向代理到子目录

我理解代理的概念(尽管从未设置过)。我正在尝试代理 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 站点,包括登录能力,但这具有明显且不幸的副作用,即阻止访问 concrete5 站点。

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']}";
}

答案1

问题:

登录表单发布到 Drupal 知道的 URL:/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。由于很少有用户可能理解通知,因此此选项可能会导致混淆。

相关内容