Apache2 несколько имен хостов, перенаправленных на одно

Я пытаюсь перенаправить несколько имен хостов только на одно, например, если вы введете любое из:

foo.example.com
www.example.com
bar.example.com
eample.com

Вы должны быть перенаправлены на www.example.com

Я установил виртуальный хост с www.example.com как ServerName, а другие как ServerAlias, и используйте mod_rewrite, чтобы проверить, правильно ли указано имя хоста, и, если нет, выполнить перенаправление.

Проблема в том, что все кажется обслуживаемым директивой ServerName hostname, поэтому mod_rewrite всегда получает www.example.com, что согласуется с документацией apache2:

Например, предположим, что вы обслуживаете домен www.domain.tld и хотите добавить виртуальный хост www.otherdomain.tld, который указывает на тот же IP-адрес. Затем вы просто добавляете следующее в httpd.conf:

NameVirtualHost *: 80

<VirtualHost *:80>
Имя_сервера www.domain.tld
ServerAlias ​​domain.tld *.domain.tld
DocumentRoot / www / domain

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot / www / otherdomain

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

Многие серверы хотят быть доступными более чем по одному имени. Это возможно с помощью директивы ServerAlias, размещенной внутри раздела. Например, в первом блоке выше директива ServerAlias ​​указывает, что перечисленные имена являются другими именами, которые люди могут использовать для просмотра того же веб-сайта:

ServerAlias ​​domain.tld *.domain.tld, затем запросы на все хосты в домене domain.tld будут обслуживаться виртуальным хостом www.domain.tld.

Есть ли какая-либо директива apache2, чтобы избежать этой функции и получить сервер запросов с именем хоста ServerAlias, которому они соответствуют?

Или я должен создать еще один виртуальный хост только для перенаправления?

Спасибо

2 ответа

Решение

Чтобы быть честным с вами, лучший подход, который я могу увидеть для этого, был бы, если бы вы обычно настраивали свой основной домен следующим образом:

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /www/domain 
</virtualhost>

Затем вы создаете новый виртуальный хост, который будет содержать все домены, которые вы хотите перенаправить следующим образом:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias foo.example.com bar.example.com others.example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>

Внутри этой папки создайте простую страницу index.php, которая вызывает 301, так что все удерживаемые там домены будут перенаправлены на ваш основной домен с кодом 301.

<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com" );
?> 

Почему вы думаете, что так лучше?

Таким образом, вам не придется постоянно обновлять кучу мест каждый раз, когда у вас есть новый домен для хранения и перенаправления на ваш основной домен, и он не будет обслуживать ваших пользователей с текущим именем, а фактически перенаправит их на ваш основной домен. обсуждаемый.

Если вы владелец сервера, вы можете сделать его еще лучше, вы можете поместить 2-го виртуального хоста в качестве первого виртуального хоста в файле httpd.conf файла vhost.conf, и всякий раз, когда вы нажимаете на IP вашего сервера, он ведет на страницу перенаправления. что приведет ваших пользователей к основному домену в этом случае, вместо того, чтобы устанавливать группу ServerAlias, вы можете просто создать запись DNS A для этого заданного субдомена или домена, ведущего к вашему IP, и сервер позаботится обо всем остальном.

В этом последнем случае все, что вам нужно для вашего виртуального хоста, будет:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>

поскольку вам не нужны ServerAlias, так как каждый запрос, который попадает на ваш IP-адрес сервера, будет направлен на ваш первый vhost.

Кроме того, если вы хотите сделать это с помощью.htaccess, это будет что-то вроде этого, я верю:

RewriteEngine on
rewritecond %{http_host} ^foo.example.com [nc]
rewriterule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Все зависит от порядка конфигурации в этом случае.

Если у вас есть такая настройка:

<VirtualHost>ServerAlias *.domain.tld</VirtualHost>
<VirtualHost>ServerName subdomain.domain.tld</VirtualHost>

Чем люди всегда окажутся на первом месте. Однако, если вы определяете их так, это работает:

<VirtualHost>ServerName subdomain.domain.tld</VirtualHost>
<VirtualHost>ServerAlias *.domain.tld</VirtualHost>

Просто помните, что шаблоны всегда должны быть внизу.

Другие вопросы по тегам