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

RewriteMap не работает, ничего не переписывается (Apache 2.4)

У меня немного уникальная ситуация: мне нужно взять поддомен и сделать его перенаправлением на случайный выбор альтернативных доменов, каждый из которых находится на отдельном сервере. Подумайте о балансировке нагрузки, за исключением того, что она технически отличается от этого.

Изучив мои варианты, Apache RewriteMap показался идеальным решением, за исключением того, что я вообще не могу заставить его что-либо делать. Вот что у меня есть на данный момент:

В моем файле конфигурации я добавил:

RewriteMap map "rnd:/home/mydomain/public_html/servers.txt"

Это в контексте сервера, а не VirtualHost или Directory. Однако у меня есть параметр «AllowOverride All» для каталога public_html. И да, я не забыл перезапустить Apache после сохранения изменений в моей конфигурации.

Далее сам файл servers.txt:

servers domain1.com|domain2.com|domain3.com

(На самом деле не имеет значения, доступны ли эти домены пользователю, поэтому я пока просто помещаю это в public_html, но я могу переместить его в другое место, если смогу заставить его работать.)

Наконец, у меня есть файл .htaccess в public_html, в котором уже есть несколько рабочих условий и правил перезаписи. RewriteEngine включен и все такое. Но когда я добавляю ...

RewriteCond %{HTTP_HOST} ^subdomain.domain.com$
RewriteRule ^(.*)$ "https://${map:servers}/$1" [P,L]

... посещение моего поддомена показывает только сам поддомен. Я пробовал множество разных флагов, но безуспешно. В лучшем случае, если я заменю флаг [P] на [R = 301], я могу получить ответ ERR_INVALID_REDIRECT от браузера, который сообщит мне, что правило, по крайней мере, обрабатывается. Кроме этого, я даже не получаю никаких ошибок в файле error_log Apache. Я также убедился, что никакие другие правила не имеют флага [L], который может привести к пропуску нового правила.

Насколько я могу судить, согласно документации Apache это именно способ использования RewriteMap, так что я, мягко говоря, немного озадачен. Может ли кто-нибудь сказать мне, что мне здесь не хватает?

Я также убедился, что никакие другие правила не имеют флага [L]

Это вызывает тревогу. Возможно, это означает, что вы разместили эти директивы не в том месте в своем .htaccess файл. Ваша "переадресация" должна располагаться в верхней части вашего .htaccess файл. (Я ожидал большинство RewriteRule директивы требовать L флаг и как минимум для оптимизации.)

Директивы mod_rewrite естественным образом объединяются в цепочку - вывод предыдущей является вводом следующей и так далее. Если вы удалили L flags из предыдущих директив и разместил перенаправление позже в файле, а затем $1 обратная ссылка захватывает не запрошенный URL, а переписанный URL из любых предыдущих директив.

Вы должны увидеть URL-адрес, который запускает ERR_INVALID_REDIRECT в браузере, отслеживая сетевой трафик (в инструментах браузера).

если я заменю флаг [P] на [R = 301]

В P flag отправляет запрос через mod_proxy (как обратный прокси - для этого требуется дополнительная конфигурация). Если хочешь внешнее перенаправление запрос, тогда вы должны использовать R флаг.