У меня есть сайт, на котором я хочу, чтобы пользователи подписались, чтобы получить свой собственный поддомен. Этот поддомен является виртуальным, и каждый субдомен использует те же файлы веб-сервера.
Я использую PHP и Apache, и я знаю о виртуальных хостах, но мне интересно, где мне нужно поместить код vhosts. Во-первых, у меня нет доступа к httpd.conf. Во-вторых, я хочу, чтобы это было сделано автоматически при регистрации.
Я читал о виртуальных хостах, но не нашел ничего, что отвечало бы на мои вопросы. Есть ли кто-нибудь, кто может объяснить мне, как все это работает вместе, или знать, где я могу найти ответы?
Можете ли вы сказать apache, чтобы прочитать дополнительный .conf-файл? (традиционно вы храните своих vhosts в httpd-vhosts.conf)
если да, добавьте что-то вроде следующего и перезапустите веб-сервер
NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /abs/path/to/webroot ServerName domainname.com ServerAlias *.domainname.com <Directory /abs/path/to/webroot> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
то в php вы можете видеть, какой субдомен запрашивает пользователь, проверяя:
$_SERVER['HTTP_HOST']
то есть. если пользователь запрашивает http://user1.domainname.com/index.php
$ _SERVER ['HTTP_HOST'] будет иметь user1.domainname.com
вы можете взорваться ('.', $ _SERVER ['HTTP_HOST']), чтобы проверить каждый сегмент .. и т. д.
Для этого вам понадобится 3 вещи:
1. Задайте свой DNS для * .yourDomain.com
2. Добавьте директиву ServerAlias в конфигурацию apache для этого домена:
ServerName www.yourDomain.com ServerAlias *.yourDomain.com yourDomain.com
Также убедитесь, что на сервере apache установлено значение UseCanonicalName
(это значение по умолчанию)
3. Грепируйте имя поддомена с помощью PHP:
$nameChunks = explode('.', $_SERVER['HTTP_HOST']); $subDomainName = $nameChunks[count($nameChunks) - 3];
(вдохновленный комментарием Янека)
Если ваш экземпляр Apache настроен для * aliasing, тогда нет необходимости создавать виртуальный именованный узел. Вы можете подделать его с помощью PHP, оценив $ _SERVER ['HTTP_HOST'].
Чтобы определить, будет ли ваш экземпляр Apache обрабатывать его, отредактируйте локальный файл / etc / hosts (или эквивалент Windows -% SystemRoot% \ system32 \ drivers \ etc \ hosts), чтобы желаемое виртуальное имя указывало на ваш сервер.
Например
# An example HOSTS file. 192.168.1.4 testserver testserver.com subdomain.testserver.com secondname.com
Предположим, что 192.168.1.4 является IP-адресом вашего сервера. Все после этого является псевдонимом, что сервер может быть вызван.
Затем, когда Янек предложил создать страницу, которая будет echo $_SERVER['HTTP_HOST']
чтобы увидеть, правильно ли оно записывает имя. Если это так, то все, что требуется, – это изменение DNS, и Apache может оставаться без изменений.
В противном случае без доступа к Apache.conf (такого рода подразумевает, что у вас нет доступа ко многим вещам), это будет трудно осуществить. Программирование не будет – но реализация будет.
Вот почему:
Apache по умолчанию будет обслуживать виртуальные хосты. Но вам нужен доступ к каталогу conf-сервера сервера (часто находящемуся в /etc/httpd/conf.d/), чтобы вы могли создать файл «включить» виртуального хоста (если конфигурация Apache настроена для его включения), то последние установки должны быть).
Вам нужно будет иметь возможность запускать Apache (перезагрузка). Без этого изменения виртуального хоста не будут влиять.
Вам нужно будет изменить DNS. Вы всегда можете изменить свой локальный файл / etc / hosts, но для того, чтобы посетители могли попасть на ваш сайт, вам нужно будет пропустить DNS-изменение. (Что может быть мгновенным – или это может занять 24 часа).
Сценарии, безусловно, можно сделать (см. Cpanel и WHM)
Прежде всего вам необходимо настроить DNS-сервер для разрешения любых поддоменов на ваш основной IP-адрес, т. *.domain.com
должен будет разрешить IP-адрес вашего сервера. Затем веб-серверу необходимо обрабатывать все входящие запросы независимо от субдомена, вызывая некоторый скрипт PHP. Сценарий PHP затем может просто выяснить, какой домен был запрошен из заголовка $_SERVER['HTTP_HOST']
и действовать соответствующим образом.
На самом деле вы не создаете поддомены при регистрации пользователей.