Назад | Перейти на главную страницу

Может ли Apache переписать заголовок Host запроса на основе URL-адреса?

Apache - это обратный прокси для моего приложения. Клиент просит http://cdn.example.com/foo/images/logo.png:

GET /foo/images/logo.png HTTP/1.1
Host: cdn.example.com

Я хочу, чтобы Apache изменил запрос, чтобы приложение на другой стороне обратного прокси получало его в формате http://foo.example.com/images/logo.png:

GET /images/logo.png HTTP/1.1
Host: foo.example.com

Переписать URL-адрес легко, но я не нашел способа изменить заголовок Host со значением, извлеченным из URL-адреса. Это возможно?

Да, вы можете изменять заголовки на основе URI. Хотя это уродливо - это единственный известный мне способ сделать это:

  1. Использовать SetEnvIF чтобы установить переменную среды, если URI соответствует тому, что вы хотите переписать.

  2. Использовать mod_headers' RequestHeader директива для сброса соответствующего заголовка запроса (Host:), если эта переменная среды установлена.

Используя SetEnvIf и Header, упомянутые выше, вот что я сделал, чтобы переписать заголовок «Accept-Encoding», чтобы уменьшить количество кэшированных копий, созданных mod_cache, проверенных работоспособностью.

# rewrite variation of the Accept-Encoding header to the same one
# to reduce the caching copies
UnsetEnv compression_ok
SetEnvIfNoCase Accept-Encoding ".*gzip.*deflate.*" compression_ok=1
RequestHeader set Accept-Encoding "gzip,deflate" env=compression_ok

Что это делает: разные браузеры устанавливают Accept-Encoding немного по-разному, например «gzip, deflate» против «gzip, deflate» (с дополнительным пространством), и это заставляет mod_cache создавать разные копии содержимого. Переписав его на то же значение, mod_cache создаст только одну копию. (примечание: мой сервер заботится только о "gzip, deflate", ваш может быть другим).