Моя проблема проста, но я не могу найти решение.
У меня есть домен www.domain.com который имеет поддомены.
корень документа www.domain.com /home/domain/public_html
Поддомены (за исключением www) необходимо перенаправить на example.com, то есть abc.domain com необходимо перенаправить на /home/example/public_html
Кроме того, необходимо сохранить URL-адрес. т.е. abc.domain.com
нужно показать в адресной строке.
Что я делал до сих пор Я сохранил в httpd.conf следующую запись в разделе
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)domain.com$
RewriteRule ^.*$ http://%1example.com$0
Однако URL-адрес меняется на abc.example.com, а www.domain.com также перенаправляется на www.example.com.
Пожалуйста, предложите лучший способ решить эту проблему.
Конфигурация виртуальных хостов, без правил перезаписи,
<VirtualHost *:80>
ServerName domain.com
ServerAlias *.domain.com www.domain.com
DocumentRoot /home/domain/public_html
UseCanonicalName Off
## User abc # Needed for Cpanel::ApacheConf
UserDir enabled abc
<IfModule !mod_disable_suexec.c>
<IfModule !mod_ruid2.c>
SuexecUserGroup abc abc
</IfModule>
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid abc abc
</IfModule>
<IfModule itk.c>
AssignUserID abc abc
</IfModule>
</VirtualHost>
Это сработало для меня:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^w]*).domain.com$
RewriteRule ^.*$ http://%1.example.com$0
Регулярное выражение теперь будет соответствовать любому имени хоста, кроме строки w. (Это нужно будет изменить, если вам когда-нибудь понадобится w.domain.com, ww.domain.com, wwww.domain.com и т. Д. Для работы.)
Вам не нужен RewriteRule
директива здесь. Вам необходимо создать виртуальный хост для субдомена, а затем назначить тот же корень документа, что и основной домен, этому субдомену.
RewriteRule
используется, когда вам нужно перенаправить браузеры пользователей на новые URL-адреса, и новый URL-адрес всегда отображается в поле URL-адреса браузеров.
Итак, вы должны удалить RewriteRule
и связанные директивы, и используйте эту конфигурацию виртуального хоста:
<VirtualHost *:80>
ServerName domain.com
ServerAlias www.domain.com
DocumentRoot /home/domain/public_html
UseCanonicalName Off
## User abc # Needed for Cpanel::ApacheConf
UserDir enabled abc
<IfModule !mod_disable_suexec.c>
<IfModule !mod_ruid2.c>
SuexecUserGroup abc abc
</IfModule>
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid abc abc
</IfModule>
<IfModule itk.c>
AssignUserID abc abc
</IfModule>
</VirtualHost>
<VirtualHost *:80>
ServerName other.domain.com
ServerAlias *.domain.com
DocumentRoot /home/example/public_html
UseCanonicalName Off
## User abc # Needed for Cpanel::ApacheConf
UserDir enabled abc
<IfModule !mod_disable_suexec.c>
<IfModule !mod_ruid2.c>
SuexecUserGroup abc abc
</IfModule>
</IfModule>
<IfModule mod_ruid2.c>
RMode config
RUidGid abc abc
</IfModule>
<IfModule itk.c>
AssignUserID abc abc
</IfModule>
</VirtualHost>
Для второго виртуального хоста вы можете использовать любое несуществующее имя поддомена для ServerName
директива. Однако вам нужен не подстановочный знак ServerName
директива там, так как подстановочные знаки разрешены только в ServerAlias
директива.
Хитрость здесь в том, что первый VirtualHost
блок используется для domain.com
и www.domain.com
, поскольку Apache использует первое соответствие VirtualHost
блок. Там корень документа установлен на /home/domain/public_html
.
Второй VirtualHost
блок используется для всех других совпадающих доменов, и там корень документа /home/example/public_html
.