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

Домен перенаправления Apache и все поддомены

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

old.com > new.com
sub.old.com > sub.new.com

Есть ли простой способ сделать это внутри httpd.conf?

Прошло некоторое время с тех пор, как я написал RewriteRule, но вот моя трещина:

RewriteEngine on

RewriteCond %{HTTP_HOST} (.+\.)?old\.com$ [NC]
RewriteRule (.*) http://%1new.com$1 [R]

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

RewriteCond сломать:

  • RewriteCond соответствует всем входящим хостам по префиксу «один или несколько символов, за которыми следует буквальная точка», за которым следует old.com. Точка находится внутри круглых скобок, потому что она не будет присутствовать, пока не будет предоставлен компонент поддомена.
  • Обратные косые черты используются для исключения значения точек. (сделай их буквальными)
  • В ? указывает, что все, что содержится в скобках, является необязательным. (компонент поддомена)
  • В $ символ прикрепляет регулярное выражение к концу строки, чтобы предотвратить странность преждевременного сопоставления.
  • В [NC] flag заставляет это быть нечувствительным к регистру.
  • Поскольку виртуальный хост гарантирует, что каждая строка содержит соответствующий шаблон, это сопоставление само по себе ничего не дает. Важно то, что круглые скобки будут фиксировать компонент поддомена входящего заголовка хоста для предстоящего RewriteRule.

RewriteRule сломать:

  • Захватить весь URI входящего запроса с помощью (.*).
  • Забегая вперед, [R] флаг указывает действие перенаправления.
  • URL-адрес перенаправления имеет две замены:
    • Первый %1, которая является первой строкой, захваченной RewriteCond. В этом случае это должен быть суффикс домена. Отсутствие префикса точки перед new.com важно: возможно, не было компонента поддомена, и в этом случае точки не должно быть. Точка должна была быть записана как часть регулярного выражения RewriteCond.
    • Второй $1, что соответствует первой строке, захваченной RewriteRule. Это должен быть URI, к которому пользователь пытался получить доступ в поддомене.

Если кто-то указывает на решение этой проблемы, которое предотвращает использование RewriteRule, браво им: вы должны предпочесть это как свое решение, где это возможно. mod_rewrite предназначен для случаев, когда вам не хватает более элегантного решения, предоставляемого специальными директивами конфигурации.

Я также должен отметить, что этот пример будет выполнять только перенаправление без HTTPS и не принимает во внимание, использует ли веб-сервер альтернативный порт. Возможно, вам придется настроить это дополнительно для особых нужд, таких как те, но это отправная точка.