Web

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

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

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

 

Ответ 1

Вы хотите создать пользовательскую запись «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

 В приведенном выше примере имена пользователей ограничены символами «a-z». Правило перезаписи для захвата поддомена будет выглядеть следующим образом:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com

RewriteRule (.*)  dostuff.php?username=%1

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

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

 

Ответ 2

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

<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 я просто вставляю свое имя пользователя в имя хоста. Это дает мне хорошие красивые SEO URL.

 

Ответ 4

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

 

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

$url=$_SERVER["REQUEST_URI"];

$account=str_replace(".yourdomain.com","",$url);

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

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

 

Ответ 5

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

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

A record => *.example.org

A record => *.example.net

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

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

// Запрос был http://qwerty.example.org

        $q = explode('.', $_SERVER['HTTP_HOST']);

        /*

            Мы получаем следующий массив

            Array  (

                [0] => qwerty

                [1] => example

                [2] => org

            )

        */

 Шаг 4. Если вторая часть массива существует, то запрос был для SUBDOMAIN, который хранится в нулевом фрагменте $q[0]. Иначе этот запрос был для главного домена.

         if(isset($q[2])) {

            // Находим в базе данных материал для логина $q[0], здесь это "qwerty"

            // Используйте $q[1], чтобы проверить, какой домен запрашивается, если вы обслуживаете несколько доменов

        }

?>

 Это решение может служить для различных доменов:

qwerty.example.org

qwerty.example.net 

 

johnsmith.somecompany.com

paulsmith.somecompany.com

 

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

smith.example.org // Показать информацию о Джоне Смите

smith.example.net // Показать информацию о Поле Смите

 

Ответ 6

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

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

 

Ответ 7

(1) Корневой .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

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

http://yourwebsite.com/index.php?siteName=9lessons на 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

 

(3) index.php

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

<?php

$siteName='';

if($_GET['siteName'] ) {

$sitePostName=$_GET['siteName'];

$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);

   if($siteNameCheck) {

     //сделайте что-нибудь. Например: подключите базу данных и проверьте 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>

 

(4) Отсутствие папки поддомена

Если вы используете корневой каталог (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

 

Схожие статьи

Web

Как заархивировать целую папку с помощью PHP

Web

Как получить массив ввода формы в массив PHP

Создание динамического веб-сайта: лучшие конструкторы сайтов
Web

Создание динамического веб-сайта: лучшие конструкторы сайтов

Web

Заменить уведомление о невыполнении заказа на количество невыполненных заказов для каждого элемента корзины на странице WooCommerce

×