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

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

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

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

powtac 09.10.2008 03:15

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

Dan Bray 06.04.2016 22:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
165
2
131 278
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

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

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

Ответ принят как подходящий

Вы хотите создать собственный Запись.

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

В приведенном выше имени пользователя можно использовать только символы a-z.


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

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

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

$username = strtok($_SERVER['HTTP_HOST'], ".");

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

theraccoonbear 08.10.2008 21:54

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

Mark Biek 08.10.2008 21:55

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

Mark Biek 08.10.2008 21:55

Означает ли это на самом деле, что PHP-код должен будет добавить новый Rewriterule только в htacccess?

Skuta 08.10.2008 21:57

Если вы правильно настроили DNS и правила перезаписи, вы просто передадите текущее имя пользователя в PHP как переменную GET. Тогда вы можете справиться с этим оттуда, как хотите.

Mark Biek 08.10.2008 22:00

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

Mark Biek 08.10.2008 22:02

Марк, я пытался поместить этот "mywebsite.com/user в .htaccess, однако веб-сайт не отображался. Я думаю, что-то пошло не так с хостингом ^^ Некоторые проблемы с паролем IIS".

Skuta 09.10.2008 17:10

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

Mark Biek 09.10.2008 18:02

Я связался с хостингом, они сказали, что мне нужно заплатить небольшую плату за перенос Интернета с IIS на сервер Linux ^^

Skuta 10.10.2008 12:47

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

Ashish Rajan 01.04.2011 15:06

Привет, Марк, я думаю, что проблема связана с IP-адресом, так как у меня общий хостинг ... Есть ли какое-либо решение этой ситуации

Ashish Rajan 01.04.2011 15:32

Ашиш, я думаю, что лучше всего разместить новый вопрос на serverfault.com с особенностями вашей конфигурации.

Mark Biek 01.04.2011 16:22

Я использовал приведенный выше код, у меня он сработал. Но когда я помещаю www.domain.com, он обрабатывает www также поддоменом. Можете ли вы изменить свой код?

Radhakrishna Rayidi 20.09.2013 21:46

@MarkBiek: нужно ли нам писать другие вещи в файле htaccess, например, Mod rewrite ON и другие вещи, или просто логика, описанная выше, может работать? извините за недостаток знаний здесь, я мало знаю о HTACCESS

noobie-php 25.09.2014 17:03

@ noobie-php, да, вам понадобятся настройки mod_rewrite и AllowOverride для вашего корневого каталога (чтобы у вас был файл .htaccess). Есть много хороших руководств по Apache / htaccess, объясняющих этот материал более подробно.

Mark Biek 26.09.2014 16:54

Возможно ли это сделать в веб-приложении с CodeIgniter?

Tom 31.10.2015 05:28

Как добавить ЗАПИСЬ в Ubuntu Im с помощью сервера LEMP? Слава Богу, благослови сэр, действительно нужна твоя помощь

Goper Leo Zosa 03.03.2016 12:13

@GoperLeoZosa, Вам, вероятно, повезет больше, если вы зададите этот вопрос на unix.stackexchange.com

Mark Biek 03.03.2016 19:20

Смотрите мое решение. У меня он отлично работает, просто используя .htaccess и wildcard subdomain.

Dan Bray 06.04.2016 22:22

@MarkBiek Tumblr делает такие URL-адреса профиля? Если да, ответьте на мой вопрос? stackoverflow.com/questions/54011867/…

Azzo 03.01.2019 16:54

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

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=&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.

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

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

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

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

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

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

Skuta 09.10.2008 17:06

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

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

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

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

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

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

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

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

Salem 24.04.2016 16:09

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

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

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

Я не могу получить доступ к файлу httpd.conf, так как я использую общий хостинг. что мне делать?

Webber Depor 27.08.2016 20:25

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

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

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

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

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

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

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

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

Create Dynamic Subdomains using PHP and Htaccess

(1) Корневой .htaccess

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

RewriteEngine On

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

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

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

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

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

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

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=
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/ [R=301,L]

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

Другие вопросы по теме