我理解概念上的代理(尽管从未设置过)。我正在尝试代理 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
。我想我可以通过重定向来解决这个问题:事实证明,大多数重定向都不会转发 POST 数据。
一个解法:
此规则有一个例外:307 将转发 POST 数据。像这样的工作:
一个警告:
当然,这种解决方案也不是没有优点和缺点。大多数浏览器会通知用户重定向(适当地,因为 POST 数据可以发送到任何地方)并询问用户他们是否打算将数据发送到新 URL。由于很少有用户可能理解该通知,因此此选项可能会导致混淆。