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

(На самом деле не имеет значения, доступны ли эти домены пользователю, поэтому я ' m просто помещаю это в 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, так что я, мягко говоря, немного озадачен. Кто-нибудь может сказать мне, что мне здесь не хватает?

1
задан 8 January 2019 в 05:32
1 ответ

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

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

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

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

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

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

0
ответ дан 4 December 2019 в 03:21

Теги

Похожие вопросы