Немногочисленные обсуждения на тему поддоменов (в том числе http://drupal.ru/node/14793) не дают чёткой ясности, как же всё таки добиться нужного результата. А нужно всего навсего создать сайт с автоматически создаваемыми поддоменами.
Остановимся на модуле subdomain.
Трудности начинаются с самого начала знакомства с этим модулем. Нет русской справки. Например, я не смог установить этот модуль. Я не программист и не знаю английский язык (несмотря на это друпал я знаю не плохо). И думаю таких много.
имеется:
Windows XP
Denwer3_Base_2008-01-13_a2.2.4_p5.2.4_m5.0.45_pma2.6.1
drupal 6.6
subdomain-6.x-1.4 (также понадобятся token-6.x-1.11, pathauto-6.x-1.1)
уточнение:
сайт будет переноситься в интернет под linux (Apache 2.x и 1.x)
Итак, начинаем, я буду коментить процесс установки, надеюсь, что в конце темы появится надпись "Получилось!". Я надеюсь на вашу помощь!!!
--------------------------------------------------------------
Включаем модули (subdomain-6.x-1.4, token-6.x-1.11, pathauto-6.x-1.1, Path)
Настройка: http://мой.сайт/admin/build/path
Можно зайти на вкладку "Subdomain settings" и посмотреть как всё плохо. Сплошные ошибки.
--------------------------------------------------------------
1 Открываем README и смотрим как и что нужно исправлять.
На сколько я понял в sites\default\setting.php в конце нужно добавить код:
// Used by the Subdomain module to generate URLs with subdomains
if (module_exists('subdomain')) {
subdomain_url_rewrite_outbound($path, $options);
}
}
function custom_url_rewrite_inbound(&$result, $path, $path_language) {
// Used by the Subdomain module to correctly interpret URLs with subdomains
if (module_exists('subdomain')) {
subdomain_url_rewrite_inbound($result, $path, $path_language);
}
}
в итоге появляется ошибка:
Drupal's inbound URL rewriting - show/hide details
HTTP request to http://subdomain-test.сайт/subdomain/test resulted in an internal Drupal path of . It should have been ~subdomain-test/subdomain/test
The custom_url_rewrite_inbound() function in settings.php is rewriting the internal path incorrectly. Did you patch settings.php? See readme.txt for instructions.
--------------------------------------------------------------
2 Edit settings.php & set $cookie_domain to your site domain. e.g.:
$cookie_domain = "example.com";
Находим в settings.php строку # $cookie_domain = 'example.com'; и изменяем её (убираем # и пишем название сайта):
$cookie_domain = 'мой.сайт';
--------------------------------------------------------------
3 Enable wildcard DNS on your DNS hosting provider (e.g. *.example.com)
что имеется ввиду?
--------------------------------------------------------------
4 Configure wildcard virtual hosts. For apache or lighttpd,
see below. For other web servers, consult their documentation.
Настраиваем apache (на денвере)
что нужно изменить?
#
# DocumentRootMatch "/home/(?!cgi-)(.*)^1/(?!cgi$|cgi-)(.*)"
# DocumentRootMatch "/home/(?!cgi-)(.*)/public_html^1"
# DocumentRootMatch "/home/(?!cgi-)(.*)^1/html/(.*)"
# DocumentRootMatch "/home/(?!cgi-)(.*)^1/domains/(?!cgi$|cgi-)(.*)"
# DocumentRootMatch "/var/www/html/(?!cgi-)~(.*)^1/(?!cgi$|cgi-)(.*)"
# DocumentRoot "$&"
# ServerName "%&/-www"
# ServerAlias "%&/-www" "%&/-www/www" $# ServerAlias *.museum.by
# ServerAlias test-1.мой.сайт
# ServerAlias test-2.мой.сайт
# ServerAlias test-3.мой.сайт
# ServerAlias admin.мой.сайт
#
# $#
# ScriptAlias /cgi/ "$^1/cgi/"
# ScriptAlias /cgi-bin/ "$^1/cgi-bin/"
#
--------------------------------------------------------------
5 Enable Subdomain settings (URL aliases -> Subdomain settings
select mode (og, node author, taxonomy vocabulary)
and additional settings as desired
идём в http://мой.сайт/admin/build/path/subdomain.
Create subdomains for: что будет выводится на поддомен (я выбираю юзера)
Using: не разобрался что это
But disallow the following subdomains: оставлять как есть?
Allow changes to user names?: Разрешить ли изменение имен пользователей
Но кроме того тут масса ошибок:
HTTP request to http://subdomain-test.мой.сайт/subdomain/test returned the following result:
HTTP_HOST:
QUERY_STRING:
REQUEST_URI:
SCRIPT_FILENAME:
drupal_get_normal_path:
Your web server is not routing subdomains to your Drupal directory.
Possible Solutions:
If you're running Apache, confirm you have the wildcard directive, ServerAlias *.museum.by, in the VirtualHost declaration in your Apache configuration
Confirm there are no rogue URL rewrite rules in your Apache configuration or .htaccess file
--------------------------------------------------------------
6 Configure Pathauto (URL aliases -> Automated alias settings):
1) Go to "Punctuation Settings" and set "Tilde ~:" to "No action"
2) Place [subdomain] at the *start* of all paths whose content you
want placed on a subdomain
не совсем понял....
надеюсь на вашу помощь, так как ничего не получилось
Комментарии
http://www.drupal.ru/node/14793
При установке:
1.Все делать по инструкции.
Заморочки:
1. Под Windows не работает.
2. В php.ini надо прописать allow_url_fopen=1
3. В settings.php строчку # $cookie_domain = 'example.com'; нельзя коментировать, а надо переписать с именем вашего домена.
4. [subdomain] надо прописывать на странице admin/build/path/pathauto в нужном разделе. Я просто заменил значение Taxonomy term path settings -> Default path pattern (applies to all vocabularies with blank patterns below): на строчку [subdomain].
После этого создал новый термин таксономии и он появился со ссылкой на новый поддомен.
wildcard DNS в subdomain как включить?
Прописыванием синонима сайта " *.site.ru " или под виндоус вручную создать ВСЕ нужные поддомены в файле hosts.
мм, в каком месте прописывается синоним(ы) у хостера?
httpd.conf
...
ServerAlias www.site.ru
ServerAlias *.site.ru
...
Под Виндовс что-ли вообще не работает? и настроить не реально?
Я побую под виндовс
В php.ini allow_url_fopen On
пробывал менять на allow_url_fopen=1
разницы не увидил
"[subdomain] надо прописывать на странице admin/build/path/pathauto в нужном разделе"
в нужном это в каком?
всё остальное делал по инструкции. Ошибки видны в прикреплённом рисунке.
На эти ошибки можешь не обращать внимание.
php.ini allow_url_fopen и функция file_get_content() нужны для второго пункта проверки.
Во втором пункте проверки функция file_get_content() читает содержимое тестовой страницы с автоматически создаваемого поддомена test.mysite.ru.
Если ты все остальное правильно настоил, то на эти ошибки можешь не обращать внимания.
Под windows тебе прийдется вручную прописать все нужные поддомены в файле hosts: test1.mysite.ru, test2.mysite.ru, test3.mysite.ru...
На странице
/admin/build/path/pathauto
Пропиши настройки как в приложенных файлах
поставь галку напротив
Bulk generate aliases for terms that are not aliased
чтобы сгенерировать алиасы для терминов у которых еще нет алиасов
На странице
http://vk24.ru/admin/build/path
должны получиться алиасы с тильдой как показано на рисунке
буду пробывать!!!
вроде чего-то добился. но ещё есть вопросы.
Всё делал как ты говорил... У меня субдомены должны создаваться для юзеров. При создании нового юзера в списке (http://site.ru/admin/build/path) создаётся новый синоним. всё как нужно. при нажатии на имя пользователя ссылка ведёт на созданный поддомен. Но тут то и проблема - поддомен не открывается. прописываю поддомены и в httpd.conf (на денвере) и в hosts (в виндовс/сустем32/драйверс). Так вот когда открываешь домен автоматически идёт перенаправление на http://поддомен.мой.сайт/denwer/ (т.е. к адресу добавляется denwer)
и открывается стартовая страница локального сервака.
не понимаю в чём дело...
может это не важно - в php.ini allow_url_fopen = On (пробывал 1), а что касается функции file_get_content(), то что с ней делать?
httpd.conf наверно не надо прописывать.
пробывал не прописывать - не помогает
ХЗ поставь на нормальном linux/unix - сервере.
Здесь есть темы про бесплатный хостинг для Drupal- поищи.
высылаю httpd.conf
настраивать на локалке лучше чем в инете.
на linux не работаю...
Чем мог - помог. По поводу httpd.conf ничего не знаю.
прочитал вашу дискусию
млин у меня уже мозг кипит
поправил $cookie_domain = "example.com";
вставил ->
// Used by the Subdomain module to generate URLs with subdomains
if (module_exists('subdomain')) {
subdomain_url_rewrite_outbound($path, $options);
}
}
function custom_url_rewrite_inbound(&$result, $path, $path_language) {
// Used by the Subdomain module to correctly interpret URLs with subdomains
if (module_exists('subdomain')) {
subdomain_url_rewrite_inbound($result, $path, $path_language);
}
}
и теперь вылетает
Fatal error: Call to undefined function: subdomain_url_rewrite_inbound() in /www/forexkin/www/htdocs/sites/default/settings.php on line 241
в чем проблема? в какое место нужно вставлять код?
2.
«Web server - show/hide details Not working yet
HTTP request to http://subdomain-test.forexking.ru/subdomain/test returned the following result:HTTP_HOST:
QUERY_STRING:
REQUEST_URI:
SCRIPT_FILENAME:
drupal_get_normal_path:
Your web server is not routing subdomains to your Drupal directory.»
это как я понял решается через хостера, прописа в httpd.conf
...
ServerAlias www.site.ru
ServerAlias *.site.ru
...
но остается еще два косяка
на момент написания сообщения остались следующие траблы ->
итак прописанный от 0 до конца как и что делать не пробовали?
с вариантами для чего что надо и где это все лежит?
Уря! разобрался!!! ))) все работает )))
Если кому нужна помощь в установке - пишите. с радостью помогу )))
НЕТ!!!
неправильный ответ!
распишите, что и как делали и что получилось!
Комментарий бы получился большим поэтому для тех кто этот модуль еще не настроил, сделал запись http://drupal.ru/node/28458
Коллеги, попытки поставить данный модуль закончились тем, что в отлогиненном состоянии все работает как должно, а в залогиненном вываливает
Fatal error: Call to undefined function: subdomain_url_rewrite_inbound()
В каком направлении копать?
рекомендую проверить:
/site/default/setting.php
туда надо было скопировать 2 функции из ридми.тхт
ну вообщето subdomain_url_rewrite_inbound() вызывается какраз из settings.php
К томуже, если не логиниться на сайте, то такая ошибка не возникает и все работает отлично, т.е. при попытке войьи по адресу subdomain.domain.ru открывается алиас domain.ru/~subdomain
Ошибка возникает только если авторизоваться. Причем не важно какую страницу открывать - не открывается ни одна.
Методом тыка выявлено, что в авторизованном стостоянии модуль subdomain.module не загружается сразу.
Что сделано:
создан отдельный файл с функциями из модуля и его инклюд в конце settings.php
subdomain_url_rewrite_inbound
subdomain_reserved
subdomain_raw_to_subdomain
Копировались они по меревозниконовения ошибок, т.е.
При попытке войти ругается на subdomain_url_rewrite_inbound - добавили, следующаяя ошибка - отсутствие subdomain_reserved - добавляем
После добавления в этот файл функции subdomain_raw_to_subdomain возникает ошибка говорящая о невозможности переинициализировать пользовательскую функцию subdomain_reserved в файле subdomain.module - т.е. этот файл прогружается в авторизованном состоянии только после обращения к subdomain_raw_to_subdomain
Вот както так.
а в картинках?
или с готовым фаилом?
Забил я на данный модуль, решил задачу средсвами nginx и алиасами.
nginx изменяет урл типа subdomain.domain.ru на domain.ru/subdomain/ на где /subdomain алиас на нужную мне ноду
типа http://server-tuning.info/nginx/auto-subdomains.html
nginx: Автоматические субдомены
Если у вас много субдоменов или вы хотите создавать их автоматически, тогда имеет смысл создать одну универсальную конфигурацию, которая будет обслуживать все субдомены, направляя запросы посетителей в соответствующие каталоги.
В первую очередь, необходимо настроить DNS: добавить субдомен с именем '*' (звездочка, без кавычек) и направить его на IP вашего веб-сервера. Немного подробнее об этом написано на странице: Apache: Автоматические субдомены.
Измените секцию server вашего сайта следующим образом:
server {
listen 80;
server_name example.com *.example.com;
root /var/www/example.com/$subdomain;
set $subdomain "";
if ($host ~* ^([a-z0-9-\.]+)\.example.com$) {
set $subdomain $1;
}
if ($host ~* ^www.example.com$) {
set $subdomain "";
}
}Не забудьте поменять example.com на имя вашего домена.
Эта конфигурация работает следующим образом:
Адрес URL Путь на сервере
http://example.com/ /var/www/example.com/
http://www.example.com/ /var/www/example.com/
http://vasya.example.com/ /var/www/example.com/vasya/
http://vasya.ivanov.example.com/ /var/www/example.com/vasya.ivanov/
Если посетитель запросит субдомен, каталог которого не существует, ему будет выдана стандартная ошибка 404 (Файл не найден).
Нет, не так.
Задача была несколько иного плана.
Решено реврайтами
Пользователь идет на vasya.domain.ru URL меняется на domain.ru/vasya в друпале соответсвенно алиас vasya назначен нужной ноде
Хотя в описании модуля субдоменов какраз такая ситуация и описана, за исключением того, что УРЛ реально не перезаписывается в отличии от реврайтов.
Еще раз.
ребята.
как сделать только для выбранных NODE становилась ляля.сайт.ру
т.е.
http://сайт.ru/?q=node/8026 показывался как http://8026.сайт.ru
или
http://сайт.ru/?q=node/koka показывался как http://koka.сайт.ru
Можно более подробно?
Нужно чтоб пользователь набирая адрес http://koka.сайт.ru попадал на ноду http://сайт.ru/?=node/koka ?
Вас не будет смущать, если пользователь набрав http://koka.сайт.ru попадет на нужную ноду но в адресной строке браузера увидит http://сайт.ru/koka ?
Я реализовал последний вариант, мне тоже нужно было переадресовывать пользователя в определенные ноды по имени субдомена
Реализовано через конфиг nginx-а и алиасы друпала
Если вас устраивает такой вариант, опишу как его реализовать
мне не страшно. это поможет для развития поисковиов и для раздачи среди заведений - и размещения а в СМИ таких ссылок клуб.сайт.ру
давайте начнем!
Поскольку сайт реально у нас один, опущу бОльшую часть конфига, привожу непосредственно необходимый нам кусок
Как отмечалось выше, нужно сказать nginx-у что у него все хосты в домене, для этого в блоке server пишем:
*.domain.ru
xxx.xxx.xxx.xxx; //IP сервера
Далее в этомже блоке (с пояснениями ниже каждого куска):
rewrite ^(.*)$ http://www.domain.ru$1 permanent;
break;
}
Если имя хоста полученного nginx-ом domain.ru (четкое совпадение) - то перезаписываем URL запроса в http://www.domain.ru/если_чтото_было_то_добавляем
set $subd $1;
rewrite ^(.*)$ http://www.domain.ru/$subd$1 permanent;
break;
}
Если имя хоста равно все_что_угодно_кроме_www.domain.ru, то назначаем переменной $sudb значение этого все_что_угодно. Перезаписываем URL в http://www.domain.ru/все_что_угодно.
В данном примере все_что_угодно ([a-z0-9_]) может состоять из латинских букв, цифр и знака подчеркивания (стандартный регексп)
set $subd $1;
rewrite ^(.*)$ http://www.domain.ru/$subd$1 permanent;
break;
}
И еще один кусок по принципу такойже, но пользователь полез не на koko.domain.ru а на www.koko.domain.ru. Работает все также.
Теперь в Друпале:
Админ->Структура->URL алиасы
Добавить алиас
Ну там собственно все и так понятно
Существующий путь http://www.domain.ru/node/8026
Алиас http://www.domain.ru/koko
Наслаждаемся.
а что делать если этого у меня пока нет? = nginx
где найти спеца по = nginx ???? отзовитесь!
Парни вопрос а с 6.14 он корректно работает?
а то вот есть VDS на дебиане, с плеском
и вроде все по инструкции сделал но не проходит тест сервера, хотя wildcart прописан(не через плеск - руками прописал)
и что интересно не проходит "Drupal's inbound URL rewriting", а вторую функцию все ок. при том что обе функции прописаны в settings.php
Тоже с бьюсь колочусь, не получается. Помогите пожалуйста или поясните как настроить субдомены в следующей ситуации:
nginx+apache
в httpd.conf:
ServerName name.ru
ServerAlias *.name.ru
DocumentRoot /var/www/admin/data/www/name.ru
SuexecUserGroup admin admin
CustomLog /var/www/httpd-logs/name.ru.access.log combined
ErrorLog /var/www/httpd-logs/name.ru.error.log
ServerAlias *.name.ru
ServerAdmin name@gname.com
php_admin_value open_basedir "/var/www/admin/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f name@gname.com"
php_admin_value upload_tmp_dir "/var/www/admin/data/mod-tmp"
php_admin_value session.save_path "/var/www/admin/data/mod-tmp"
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
AllowOverride All
в nginx.conf:
server {
listen xxx.xx.xx.xx:80;
server_name *.name.ru name.ru www.name.ru;
rewrite ^(/manager/.*)$ https://$host$1 permanent;
location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {
proxy_pass http://xxx.xx.xx.xx:8080;
proxy_redirect http://name.ru:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_pass http://xxx.xx.xx.xx:8080;
proxy_redirect http://name.ru:8080/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
access_log /var/www/httpd-logs/name.ru.access.log;
error_page 404 = fallback;
}
location fallback {
proxy_pass http://xxx.xx.xx.xx:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
Не нравиться ему именно Вэб сервер, остальные ошибки поборол.Web server - show/hide details Not working yet
Чего я только не пробовал.
Прошу у кого получилось - выложите свои настройки nginx в связке с апачем для работы subdomain.