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






Помимо изменений конфигурации на вашем 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
Поддомен действительно выглядит красиво. Однако для настройки потребуется гораздо больше работы, потому что вам нужно будет убедиться, что все запросы субдоменов обрабатываются должным образом. Это не страшно с Apache, но может быть сложно в размещенной среде.
@theraccoonbear Предполагая, что вы также можете использовать подстановочные знаки с CNAME, это мысль.
Означает ли это на самом деле, что PHP-код должен будет добавить новый Rewriterule только в htacccess?
Если вы правильно настроили DNS и правила перезаписи, вы просто передадите текущее имя пользователя в PHP как переменную GET. Тогда вы можете справиться с этим оттуда, как хотите.
PHP не нужно беспокоиться о добавлении чего-либо. Он просто занимается тем, что ему скармливают.
Марк, я пытался поместить этот "mywebsite.com/user в .htaccess, однако веб-сайт не отображался. Я думаю, что-то пошло не так с хостингом ^^ Некоторые проблемы с паролем IIS".
Я должен был быть более конкретным. .htaccess предназначен для Apache, а не для IIS. Я не уверен, как переопределение URL-адресов обрабатывается с помощью IIS, но я считаю, что там были некоторые вопросы по SO.
Я связался с хостингом, они сказали, что мне нужно заплатить небольшую плату за перенос Интернета с IIS на сервер Linux ^^
привет, я выполнил шаги, которые вы дали выше, но когда я делаю xyz.mydomain.com, он перенаправляется на xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Нужно ли мне делать что-нибудь еще, кроме шагов, упомянутых выше?
Привет, Марк, я думаю, что проблема связана с IP-адресом, так как у меня общий хостинг ... Есть ли какое-либо решение этой ситуации
Ашиш, я думаю, что лучше всего разместить новый вопрос на serverfault.com с особенностями вашей конфигурации.
Я использовал приведенный выше код, у меня он сработал. Но когда я помещаю www.domain.com, он обрабатывает www также поддоменом. Можете ли вы изменить свой код?
@MarkBiek: нужно ли нам писать другие вещи в файле htaccess, например, Mod rewrite ON и другие вещи, или просто логика, описанная выше, может работать? извините за недостаток знаний здесь, я мало знаю о HTACCESS
@ noobie-php, да, вам понадобятся настройки mod_rewrite и AllowOverride для вашего корневого каталога (чтобы у вас был файл .htaccess). Есть много хороших руководств по Apache / htaccess, объясняющих этот материал более подробно.
Возможно ли это сделать в веб-приложении с CodeIgniter?
Как добавить ЗАПИСЬ в Ubuntu Im с помощью сервера LEMP? Слава Богу, благослови сэр, действительно нужна твоя помощь
@GoperLeoZosa, Вам, вероятно, повезет больше, если вы зададите этот вопрос на unix.stackexchange.com
Смотрите мое решение. У меня он отлично работает, просто используя .htaccess и wildcard subdomain.
@MarkBiek Tumblr делает такие URL-адреса профиля? Если да, ответьте на мой вопрос? stackoverflow.com/questions/54011867/…
Я делаю это немного иначе, чем Марк. Я передаю весь домен и беру поддомен в 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?
Мы настраиваем подстановочный DNS, как описано выше. Итак, запись - * .yourname.com
Тогда все поддомены фактически отправляются в одно и то же место, но PHP обрабатывает каждый поддомен как отдельную учетную запись.
Мы используем следующий код:
$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);
Этот код просто устанавливает переменную $account так же, как поддомен. Затем вы можете получить их файлы и другую информацию на основе их учетной записи.
Вероятно, это не так эффективно, как перечисленные выше способы, но если у вас нет доступа к BIND и / или ограниченному .htaccess, этот метод должен работать (если ваш хост установит для вас подстановочный знак).
Фактически мы используем этот метод для подключения к базе данных клиентов для приложения электронной коммерции, состоящего из нескольких компаний, но он может работать и для вас.
Я думаю, что это может быть точный ответ, поскольку я спрашиваю, как PHP обрабатывает субдомены, а НЕ как web или DNS Серверы обрабатывает субдомены.
Функция, которую вы ищете, называется Поддомены с подстановочными знаками. Это позволяет вам не настраивать DNS для каждого поддомена, а вместо этого использовать перезапись apache для перенаправления. Вы можете найти хороший учебник здесь, но существуют тысячи учебных пособий. Вот необходимый код из этого руководства:
<VirtualHost 111.22.33.55>
DocumentRoot /www/subdomain
ServerName www.domain.tld
ServerAlias *.domain.tld
</VirtualHost>
Однако, поскольку для этого требовалось использование VirtualHosts, он должен быть установлен в файле httpd.conf сервера, а не в локальном .htaccess.
Я не могу получить доступ к файлу httpd.conf, так как я использую общий хостинг. что мне делать?
Я просто хотел добавить, что если вы используете 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
Этот файл является перенаправлением 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/
Этот файл перезаписывает 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.
Этот файл содержит простой код 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
Возможно, не требуется запрашивать у вашего провайдера доступ к DNS, поскольку маршрутизация поддоменов (ответ Марка) уже активирована! Просто попробуйте в браузере, если поддомены дают результат. А затем направьте их с помощью файла .htaccess.