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


162

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

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


Возможно, нет необходимости запрашивать у вашего провайдера доступ к DNS, поскольку маршрутизация на субдомене (ответ Марка) уже активирована! Просто попробуйте в вашем браузере, если субдомены дают вам результат. А затем направьте их с помощью файла .htaccess.
Powtac

Если вы можете использовать wildcard subdomainsэто может быть достигнуто в .htaccess. Смотрите мое решение.
Дэн Брей

Ответы:


135

Вы ищете, чтобы создать пользовательскую запись .

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

1
Если бы каждый субдомен не обслуживался с другого сервера, лучше было бы создать записи канонического имени (CNAME). en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear

Субдомен выглядит красиво. Однако будет гораздо больше работы по настройке, потому что вам нужно будет убедиться, что все запросы субдоменов обрабатываются правильно. Это не страшно с Apache, но может быть сложно в размещенной среде.
Марк Бик

@theraccoonbear Предполагается, что вы также можете использовать шаблоны с CNAME, это мысль.
Марк Бик

3
Я должен был быть более конкретным. .htaccess для Apache, а не IIS. Я не уверен, как переписывание URL обрабатывается с IIS, но я думаю, что там было несколько вопросов о SO.
Марк Бик

1
Привет, Марк, я выполнил шаги, которые ты дал выше, но когда я делаю xyz.mydomain.com, он перенаправляет на xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Нужно ли делать что-то еще, кроме шагов, упомянутых выше ?
Ашиш Раджан

30

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

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

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


Я не могу получить доступ к файлу httpd.conf, так как нахожусь на виртуальном хостинге. Что я могу сделать?
Уэббер Депор

23

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

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

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

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

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

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

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

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


2
Я думаю, что это может быть правильный ответ, так как оп спрашивают о том, как PHP обрабатывает субдоменов, а не как веб- серверы или DNS- серверы обрабатывают субдомены.
Салем

8

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

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

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

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

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


1
Я не совсем уверен, как это использовать .. и в конце концов, почему бы не испортить htaccess?
Скута

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 

4

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


4

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

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


3

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

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


3

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

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


1

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


0

Создание динамических поддоменов с использованием PHP и Htaccess

(1) Root .htaccess

Этот файл перенаправляется с http://www.yourwebsite.com на http://yourwebsite.com для использования на домашней странице. Перенаправление всех поддоменов в папку yourwebsite_folder

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2) Внутри папки .htaccess

Этот файл переписывает URL субдомена.

http://yourwebsite.com/index.php?siteName=9lessons to http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

Дополнительные советы .htaccess: руководство по использованию файлов Htaccess и советы.

index.php

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

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

Папка без субдомена

Если вы используете корневой каталог (htdocs / public_html) в качестве каталога проекта, используйте следующий файл .htaccess.

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.