Как мне создать поддомен типа 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