Як дозволити PHP автоматично створювати піддомен для кожного користувача?


162

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

Тим, хто відповів: Ну що ж, я повинен запитати хостинг, чи надають вони якийсь доступ до DNS?


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

Якщо ви можете використовувати wildcard subdomainsце можна досягти в .htaccess. Дивіться моє рішення.
Dan Bray

Відповіді:


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
Якщо кожен субдомен не подається з іншого сервера, я б створив записи Canonical Name (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 ... Чи потрібно мені робити щось інше, ніж кроки, згадані вище ?
Ashish Rajan

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 та / або обмеженого.

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


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
Я не дуже впевнений, як це використовувати .. і врешті-решт, чому б не зіпсувати хтацеси?
Skuta

6

Просте рішення PHP для субдоменів та багатодоменних веб-додатків

Крок 1. Надайте запис DNS як "*" для доменів (або домену), які ви будете обслуговувати "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, це може стати складним.

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


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) Корінь .htaccess

Цей файл перенаправляється з http://www.yourwebsite.com на http://yourwebsite.com для використання на домашній сторінці. Всі перенаправлення субдомену на вашу веб-сторінку_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 до 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.