Вопрос или проблема
Я использую 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 при правильных настройках сервера.
Шаги для реализации:
-
Проверьте конфигурацию Apache: Убедитесь, что модуль mod_proxy включен, так как это критично для работы с
[P]
— proxy флагом в mod_rewrite. -
Редактируйте .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 без соответствующих прав.
-
-
Убедитесь в корректности конфигурации сервера:
- Убедитесь, что серверная конфигурация позволяет использование директивы
ProxyPreserveHost
в .htaccess, хоть это и требует настройки через основной конфигурационный файлhttpd.conf
илиapache2.conf
.
- Убедитесь, что серверная конфигурация позволяет использование директивы
Если на уровне .htaccess не удаётся решить задачу из-за ограничений, может потребоваться доступ к конфигурационным файлам Apache для более гибкой настройки.
Заключение
Иногда конфигурации на уровне .htaccess ограничены спецификой Apache и самой инфраструктуры хостинга. В таких случаях, прямое изменение конфигурационных файлов может стать необходимостью для обеспечения правильного поведения прокси-сервера. Обратитесь к системному администратору, если у вас нет доступа к основной конфигурации Apache.