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

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

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

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

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

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

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

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

ИмяVirtualHost *: 80

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

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot / www / другой домен

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

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

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

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

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

Спасибо

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

<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" );
?> 

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

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

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

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

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

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

Кроме того, если бы вы хотели сделать это с помощью .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>

Тогда люди всегда будут попадать на первый vhost. Однако, если вы определите их так, это сработает:

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

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