Обратный прокси подкаталог к ​​подкаталогу с 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 Server (drupal.domain.com)

  • Довольно стандартный сайт с большим количеством отвратительных перенаправлений. Перенаправления, кажется, требуют RewriteRule обойти.

Что работает (но не то, что мне нужно)

Хотя это дает полный доступ к сайту drupal, включая возможность входа в систему, это имеет очевидный и неприятный побочный эффект - предотвращение доступа к сайту concrete5.

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

Что я сейчас пытаюсь

При следующей настройке я могу получить доступ к страницам Drupal, используя URL 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 Config

Здесь я пытаюсь заставить 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 ответ

Решение

Эта проблема:

Форма входа в систему публикует 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-адрес. Поскольку немногие пользователи могут понять уведомление, эта опция может привести к путанице.

Другие вопросы по тегам