У меня довольно нубский вопрос о том, как работают поддомены.
Как я понимаю, сначала DNS-сервер указывает, что запрос для определенного subdomain.domain.com должен идти на IP-адрес domain.com, а веб-сервер на domain.com дополнительно обрабатывает запрос и отображает необходимую страницу поддомена.
Мне не совсем понятно, как (например, Apache) сервер это делает. Насколько я понимаю, могут быть записи в vhosts.conf
файл, в котором указаны папки, содержащие данные поддомена. Что-то вроде:
<VirtualHost *>
ServerName www.domain.com
DocumentRoot /home/httpd/htdocs/
</VirtualHost>
<VirtualHost *>
ServerName subdomain.domain.com
DocumentRoot /home/httpd/htdocs/subdomain/
</VirtualHost>
а также могут быть записи перенаправления в .htaccess
файлы вроде
rewritecond %{http_host} ^subdomain.domain.com [nc]
rewriterule ^(.*)$ http://www.domain.com/subdomain/ [r=301,nc]
однако в этом случае пользователь направляется в каталог, который содержит данные поддомена, но пользователь выходит из поддомена.
Я хотел бы знать - как, когда собираюсь subdomain.domain.com
то subdomain.domain.com
, начало адреса остается видимым в адресной строке проводника?
Можно ли это сделать с помощью альтернативной записи в .htaccess
файл?
Если VirtualHost
запись указана в vhosts.conf
означает ли это, что для доступа к этому каталогу необходимо указать новую учетную запись пользователя?
HTTP / 1.1 требует, чтобы каждый хост содержал имя запрашиваемого сервера. Итак, просьба к http://www.foo.bar.com
сначала выполнит поиск в DNS, чтобы узнать, какой сервер связан с www.foo.bar.com
. Это может быть запись CNAME, указывающая на веб-сервер, и, возможно, этот же веб-сервер обслуживает контент для http://courses.cs.bar.com
. Оба адреса идут в одно и то же место, но Apache может различать эти два адреса, потому что видит, куда браузер пытается перейти с каждым запросом.
Итак, предполагая, что DNS отправляет www.domain.com
и subdomain.domain.com
трафик на один и тот же сервер, этот сервер имеет разную конфигурацию для каждого и может обслуживать разные документы.
Использование двух виртуальных хостов на одном хосте функционально эквивалентно наличию двух отдельных физических веб-серверов.
Для доступа не нужно указывать новую учетную запись пользователя. Ко всем файлам обращается пользователь, запустивший apache, который обычно apache
пользователь. Этот пользователь должен иметь возможность читать все файлы, которые он обслуживает, в обоих корнях документов.
Правило перезаписи вступает в силу до обработки виртуального хоста. В этой ситуации веб-сервер перезаписывает URL-адрес, чтобы клиент указывал на другой URL-адрес. mod_rewrite также отправляет 301 браузеру, сообщая ему, что контент находится где-то еще. Согласно спецификации HTTP, любой браузер, получающий этот код, должен переключиться на запрос с данного HTTP-адреса (заменив старый адрес в адресной строке браузера).
Это похоже на то, как каждый раз пользователь переходит на поддомен, предоставляя ему страницу с надписью «это где-то еще» и прося ввести новый адрес в свой браузер.
Поскольку записи VirtualHost являются частью основной конфигурации сервера, а не параметрами, зависящими от каталога, их нельзя поместить в файл .htaccess.
Чтобы ответить на ваш вопрос о конфигурации для двух поддоменов:
<VirtualHost *>
ServerName www.domain.com
DocumentRoot /public_html
</VirtualHost>
<VirtualHost *>
ServerName subdomain.domain.com
DocumentRoot /public_html/subdomain
</VirtualHost>
Убедитесь, что это именно то, что вам нужно; все содержимое «поддомена» будет доступно с адреса «www», если пользователь добавит «поддомен» к URL-адресу.
Что касается вашего второго вопроса, это можно сделать с помощью ServerAlias. В основном это означает, что существует один виртуальный сервер, но к нему можно получить доступ по нескольким именам.
<VirtualHost *>
ServerName www.domain.com
ServerAlias subdomain.domain.com
DocumentRoot /public_html
</VirtualHost>
И что касается последнего, если у вас есть доступ для изменения как DNS, так и вашей основной конфигурации Apache, вам больше ничего не нужно. Я не знаю, как работает ваш конкретный хостинг-провайдер; возможно, вам придется с ними разобраться, если у вас нет доступа к этим двум вещам.