mod_rewrite Proxy – сохранять заголовки хоста

Вопрос или проблема

Я использую mod_rewrite, чтобы проксировать подкаталог следующим образом:

RewriteRule  ^somedir/(.*)$  http://proxy.example/somedir/$1  [P,L]

Это означает, что запросы к http://local.example/somedir проксируются к http://proxy.example/somedir

Мне сказали люди с удаленного расположения (например, proxy.example), что заголовки хоста, читаемые их системами, видят “proxy.example” как хост, но они требуют от нас сохранить “local.example” как заголовок хоста.

Как это можно сделать? Я надеюсь сохранить все в .htaccess и не переходить на ProxyPass.

ProxyPreserveHost может помочь вам в этой ситуации. См.
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypreservehost

.

Ответ или решение

Для решения задачи, связанной с необходимостью сохранения оригинального заголовка хоста при использовании проксирования через mod_rewrite в Apache, существует несколько шагов. Вы интересуетесь как это осуществить, оставаясь в рамках использования .htaccess, без перехода на конфигурацию с ProxyPass.

Описание проблемы

Вы используете правило переписывания mod_rewrite для переадресации запросов из поддиректории на удалённый сервер как показано ниже:

RewriteRule  ^somedir/(.*)$  http://proxy.example/somedir/$1  [P,L]

Запросы на http://local.example/somedir перенаправляются на http://proxy.example/somedir. Однако, инфраструктура на proxy.example требует, чтобы заголовок Host оставался local.example.

Решение

Одно из решений — использование директивы ProxyPreserveHost, которая сохраняет оригинальный заголовок Host при выполнении proxy-запросов. Эта директива устанавливается в конфигурации Apache, но её можно применить и в .htaccess при правильных настройках сервера.

Шаги для реализации:

  1. Проверьте конфигурацию Apache: Убедитесь, что модуль mod_proxy включен, так как это критично для работы с [P] — proxy флагом в mod_rewrite.

  2. Редактируйте .htaccess:

    • Добавьте следующую строку в начале вашего .htaccess файла, перед правилом mod_rewrite:

      RewriteEngine On
      RewriteRule ^somedir/(.*)$ http://proxy.example/somedir/$1 [P,L]
      # Используем директиву через правила .htaccess:
      Header set Host "local.example" env=P
    • Обратите внимание, что использование Header set Host так, как показано выше, требует, чтобы сервер поддерживал директиву mod_headers и был настроен на использование её с proxy-запросами, что не всегда возможно в .htaccess без соответствующих прав.

  3. Убедитесь в корректности конфигурации сервера:

    • Убедитесь, что серверная конфигурация позволяет использование директивы ProxyPreserveHost в .htaccess, хоть это и требует настройки через основной конфигурационный файл httpd.conf или apache2.conf.

Если на уровне .htaccess не удаётся решить задачу из-за ограничений, может потребоваться доступ к конфигурационным файлам Apache для более гибкой настройки.

Заключение

Иногда конфигурации на уровне .htaccess ограничены спецификой Apache и самой инфраструктуры хостинга. В таких случаях, прямое изменение конфигурационных файлов может стать необходимостью для обеспечения правильного поведения прокси-сервера. Обратитесь к системному администратору, если у вас нет доступа к основной конфигурации Apache.

Оцените материал
Добавить комментарий

Капча загружается...