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

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

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

Ответ 1

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

Я уверен, что вы можете использовать подстановочные знаки при указании записей 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

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


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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

Простое решение 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 

Ответ 7

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

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

Ответ 8

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

Ответ 9

Во-первых, вам нужно убедиться, что ваш сервер настроен на разрешение поддоменов подстановочных знаков. Я достиг этого в 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]

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

Ответ 10

Это может быть достигнуто в .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]

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

Ответ 11

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