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