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>
Просто помните, что шаблоны всегда должны быть внизу.