Как разрешить PHP создавать субдомен автоматически для каждого пользователя?

Как создать субдомен, например http://user.mywebsite.com ? Мне нужно как-то получить доступ к htaccess? Можно ли просто создать его с помощью чистого php-кода, или мне нужно использовать внешний язык на стороне сценария?

Тем, кто ответил: Ну, тогда я должен спросить мой хостинг, если они предоставляют какой-то доступ к DNS?

Вы хотите создать пользовательскую запись A.

Я уверен, что вы можете использовать подстановочные знаки при указании записей A, которые позволят вам сделать что-то вроде этого:

 *.mywebsite.com IN A 127.0.0.1 

127.0.0.1 будет IP-адресом вашего веб-сервера. Метод фактического добавления записи будет зависеть от вашего хоста.


Сделать это, как http://mywebsite.com/user, было бы намного легче настроить, если это вариант.

Затем вы можете просто добавить файл .htaccess, который выглядит так:

 Options +FollowSymLinks RewriteEngine On RewriteRule ^([aA-zZ])$ dostuff.php?username=$1 

В приведенном выше примере имена пользователей ограничены символами az


Правило перезаписи для захвата субдомена будет выглядеть так:

 RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com RewriteRule (.*) dostuff.php?username=%1 

Функция, которой вы пользуетесь, называется поддоменами подстановочных знаков . Это позволяет вам не настраивать DNS для каждого субдомена, а вместо этого использовать перезаписи apache для перенаправления. Здесь вы можете найти хороший учебник, но есть тысячи учебных пособий. Вот нужный код из этого учебника:

 <VirtualHost 111.22.33.55> DocumentRoot /www/subdomain ServerName www.domain.tld ServerAlias *.domain.tld </VirtualHost> 

Однако поскольку для этого требуется использование VirtualHosts, он должен быть установлен в файле httpd.conf сервера вместо локального .htaccess.

Я немного отличаюсь от Марка. Я передаю весь домен и захвачу субдомен в php.

 RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST} 

Это игнорирует изображения и отображает все остальное в файл index.php. Поэтому, если я пойду

 http://fred.mywebsite.com/album/Dance/now 

Я вернусь

 http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com 

Затем в моем коде index.php я просто взорву свое имя пользователя из hostName. Это дает мне приятные URL-адреса SEO.

Мы настраиваем подстановочный DNS, как они объясняли выше. Таким образом, запись * .yourname.com

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

Мы используем следующий код:

 $url=$_SERVER["REQUEST_URI"]; $account=str_replace(".yourdomain.com","",$url); 

Этот код просто устанавливает переменную $account же, как и поддомен. Затем вы можете получить их файлы и другую информацию на основе их учетной записи.

Это, вероятно, не так эффективно, как перечисленные выше, но если у вас нет доступа к BIND и / или ограниченному .htaccess, этот метод должен работать (пока ваш хост будет настраивать подстановочный шаблон для вас).

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

Не суетитесь с файлами .htaccess, когда вы можете использовать массовый виртуальный хостинг Apache .

Из документации:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

В некотором роде это обратное вашему вопросу: каждый «поддомен» является пользователем. Если пользователь не существует, вы получаете 404.

Единственный недостаток заключается в том, что переменная окружения DOCUMENT_ROOT неправильно настроена на используемый подкаталог, но по умолчанию document_root в htconfig.

Простое решение PHP для субдоменов и многодоменных веб-приложений

Шаг 1. Предоставьте запись DNS A как «*» для доменов (или домена), которые вы собираетесь обслуживать «example.org»

 A record => *.example.org A record => *.example.net 

Шаг 2. Проверьте уникальность логинов при регистрации или изменении имени пользователя. Кроме того, избегайте точек в этих входах.

Шаг 3. Затем проверьте запрос

  // Request was http://qwerty.example.org $q = explode('.', $_SERVER['HTTP_HOST']); /* We get following array Array ( [0] => qwerty [1] => example [2] => org ) */ // Step 4. // If second piece of array exists, request was for // SUBDOMAIN which is stored in zero-piece $q[0] // otherwise it was for DOMAIN if(isset($q[2])) { // Find stuff in database for login $q[0] or here it is "qwerty" // Use $q[1] to check which domain is asked if u serve multiple domains } ?> 

Это решение может обслуживать разные области

 qwerty.example.org qwerty.example.net johnsmith.somecompany.com paulsmith.somecompany.com 

Если вам нужны одинаковые ники в разных доменах, которые по-разному обслуживаются, вам может потребоваться сохранить выбор пользователя для домена при регистрации входа.

 smith.example.org // Show info about John Smith smith.example.net // Show info about Paul Smith 

Вы могли [потенциально] переписать URL-адрес, но да: вы должны контролировать свои настройки DNS, чтобы при добавлении пользователя он получал свой собственный поддомен.

В дополнение к изменениям конфигурации на вашем WWW-сервере для обработки нового субдомена, ваш код должен будет вносить изменения в ваши записи DNS. Таким образом, если вы не используете свой собственный BIND (или похожий), вам нужно выяснить, как получить доступ к конфигурации вашего поставщика имен. Если они не предлагают какой-то API, это может оказаться сложным.

Обновление: да, я бы уточнил у вашего регистратора, если они также предоставляют службу сервера имен (как это часто бывает). Я никогда не изучал этот вариант раньше, но я подозреваю, что большинство регистраторов нет. Я Googled для API GoDaddy и API-интерфейсов GoDaddy DNS, но не смог ничего изменить, поэтому, я думаю, лучшим вариантом было бы проверить онлайн-справку с вашим провайдером, и если это не ответит на вопрос, их вспомогательного персонала.

Во-первых, вам нужно убедиться, что ваш сервер настроен на разрешение поддоменов подстановочных знаков. Я достиг этого в JustHost, создав подномен вручную с именем * . Я также указал папку subdomains в качестве корня документа для поддоменов подстановочных знаков. Добавьте это в файл .htaccess в папку поддоменов:

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.website\.com$ RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$ RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1 RewriteRule ^(.*)$ /%1/$1 [QSA] 

Наконец, все, что вам нужно сделать, это создать папку в вашей папке поддоменов, а затем поместить файлы субдомена в этот каталог.

Это может быть достигнуто в .htaccess если ваш сервер настроен для разрешения поддоменов подстановочных знаков. Я достиг этого в JustHost, создав подномен вручную с именем * и указав папку поддоменов в качестве корня документа для поддоменов подстановочных знаков. Добавьте это в ваш .htaccess файл:

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.website\.com$ RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$ RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1 RewriteRule ^(.*)$ /%1/$1 [QSA] 

Наконец, создайте папку для вашего поддомена и поместите файлы поддоменов.

Я просто хотел добавить, что если вы используете CloudFlare (бесплатно), вы можете использовать их API для управления вашими DNS с легкостью.