Как разрешить PHP создавать субдомен автоматически для каждого пользователя?
Как создать субдомен, например http://user.mywebsite.com? Мне нужно как-то получить доступ к htaccess? Можно ли просто создать его с помощью чистого php-кода или мне нужно использовать внешний внешний script -серверный язык?
Тем, кто ответил: "Ну, тогда я должен спросить мой хостинг, если они предоставляют какой-то доступ к DNS"
Ответы
Ответ 1
Вы хотите создать пользовательскую запись.
Я уверен, что вы можете использовать подстановочные знаки при указании записей 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
Ответ 2
Эта функция называется поддомены подстановок. Это позволяет вам не настраивать DNS для каждого субдомена, а вместо этого использовать перезаписи apache для перенаправления. Здесь вы можете найти хороший учебник но есть тысячи обучающих программ. Вот необходимый код из этого учебника:
<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 я просто взорву свое имя пользователя из hostName. Это дает мне приятные URL-адреса SEO.
Ответ 4
Мы настраиваем подстановочный DNS, как они объясняли выше. Таким образом, запись - *.yourname.com
Затем все субдомены на самом деле идут в одно и то же место, но PHP обрабатывает каждый поддомен как другую учетную запись.
Мы используем следующий код:
$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);
Этот код просто устанавливает переменную $account
так же, как и поддомен. Затем вы можете извлечь их файлы и другую информацию на основе их учетной записи.
Это, вероятно, не так эффективно, как способы, перечисленные выше, но если у вас нет доступа к BIND и/или ограниченному .htaccess, этот метод должен работать (пока ваш хост будет настраивать подстановочный шаблон для вас).
Мы фактически используем этот метод для подключения к базе данных клиентов для приложения для электронной коммерции с несколькими компаниями, но оно может работать и на вас.
Ответ 5
Не суетитесь с файлами .htaccess, когда вы можете использовать массовый виртуальный хостинг Apache.
Из документации:
#include part of the server name in the filenames
VirtualDocumentRoot /www/hosts/%2/docs
В некотором смысле это обратное вашему вопросу: каждый "поддомен" является пользователем. Если пользователь не существует, вы получаете 404.
Единственным недостатком является то, что переменная среды DOCUMENT_ROOT
неправильно настроена на используемый подкаталог, но по умолчанию document_root в htconfig.
Ответ 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
Ответ 7
В дополнение к изменениям конфигурации на вашем WWW-сервере для обработки нового субдомена, ваш код должен будет вносить изменения в ваши записи DNS. Итак, если вы не используете свой собственный BIND (или похожий), вам нужно выяснить, как получить доступ к конфигурации поставщика имен. Если они не предлагают какой-то API, это может оказаться сложным.
Обновление: да, я бы уточнил у вашего регистратора, если они также предоставляют службу сервера имен (как это часто бывает). Я никогда не изучал этот вариант раньше, но я подозреваю, что большинство регистраторов нет. Я Googled для API GoDaddy и API-интерфейсов GoDaddy DNS, но не смог ничего изменить, поэтому, я думаю, лучшим вариантом было бы проверить онлайн-справку с вашим провайдером, и если это не ответит на вопрос, их вспомогательного персонала.
Ответ 8
Вы можете [потенциально] выполнить переписывание URL-адреса, но да: вы должны контролировать свои настройки DNS, чтобы при добавлении пользователя он получал свой собственный поддомен.
Ответ 9
Во-первых, вам нужно убедиться, что ваш сервер настроен на разрешение поддоменов подстановочных знаков. Я достиг этого в 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]
Наконец, все, что вам нужно сделать, это создать папку в вашей папке поддоменов, а затем поместить файлы поддомена в этот каталог.
Ответ 10
Это может быть достигнуто в .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]
Наконец, создайте папку для вашего поддомена и поместите файлы поддоменов.
Ответ 11
Я просто хотел добавить, что если вы используете CloudFlare (бесплатно), вы можете использовать свой API для управления своими dns с легкостью.