Как позволить PHP создавать поддомен автоматически для каждого пользователя? - PullRequest
154 голосов
/ 08 октября 2008

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

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

Ответы [ 11 ]

130 голосов
/ 08 октября 2008

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

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

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

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

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

23 голосов
/ 08 октября 2008

Я делаю это немного по-другому от Марка. Я передаю весь домен и хватаю поддомен в 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. Это дает мне красивые красивые SEO URL.

14 голосов
/ 02 марта 2009

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

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

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

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

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

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

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

8 голосов
/ 09 октября 2008

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

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

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

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

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

6 голосов
/ 23 декабря 2014

Простое 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 
4 голосов
/ 08 октября 2008

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

4 голосов
/ 08 октября 2008

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

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

3 голосов
/ 06 апреля 2016

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

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

2 голосов
/ 06 апреля 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...