У меня немного уникальная ситуация: мне нужно взять поддомен и сделать его перенаправлением на случайный выбор альтернативных доменов, каждый из которых находится на отдельном сервере. Подумайте о балансировке нагрузки, за исключением того, что она технически отличается от этого.
Изучив мои варианты, 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
флаг.