подробно про субдомены subdomain

Главные вкладки

Аватар пользователя Dec0der Dec0der 13 ноября 2008 в 13:58

Немногочисленные обсуждения на тему поддоменов (в том числе 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 в конце нужно добавить код:

function custom_url_rewrite_outbound(&$path, &$options, $original_path) {

    // 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?: Разрешить ли изменение имен пользователей

Но кроме того тут масса ошибок:

Web server - show/hide details Not working yet
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

не совсем понял....

надеюсь на вашу помощь, так как ничего не получилось Sad

Комментарии

Аватар пользователя Dimm Dimm 13 ноября 2008 в 19:00

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
...

Аватар пользователя Dec0der Dec0der 10 ноября 2015 в 11:45

Под Виндовс что-ли вообще не работает? и настроить не реально?

Я побую под виндовс

В php.ini allow_url_fopen On
пробывал менять на allow_url_fopen=1
разницы не увидил

"[subdomain] надо прописывать на странице admin/build/path/pathauto в нужном разделе"
в нужном это в каком?

всё остальное делал по инструкции. Ошибки видны в прикреплённом рисунке.

Аватар пользователя Dimm Dimm 14 ноября 2008 в 16:00

На эти ошибки можешь не обращать внимание.

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...

Аватар пользователя Dimm Dimm 10 ноября 2015 в 11:45

На странице
/admin/build/path/pathauto
Пропиши настройки как в приложенных файлах
поставь галку напротив
Bulk generate aliases for terms that are not aliased
чтобы сгенерировать алиасы для терминов у которых еще нет алиасов

Аватар пользователя Dec0der Dec0der 6 июля 2010 в 1:32

вроде чего-то добился. но ещё есть вопросы.
Всё делал как ты говорил... У меня субдомены должны создаваться для юзеров. При создании нового юзера в списке (http://site.ru/admin/build/path) создаётся новый синоним. всё как нужно. при нажатии на имя пользователя ссылка ведёт на созданный поддомен. Но тут то и проблема - поддомен не открывается. прописываю поддомены и в httpd.conf (на денвере) и в hosts (в виндовс/сустем32/драйверс). Так вот когда открываешь домен автоматически идёт перенаправление на http://поддомен.мой.сайт/denwer/ (т.е. к адресу добавляется denwer)
и открывается стартовая страница локального сервака.

не понимаю в чём дело...

может это не важно - в php.ini allow_url_fopen = On (пробывал 1), а что касается функции file_get_content(), то что с ней делать?

Аватар пользователя Dimm Dimm 17 ноября 2008 в 12:28

ХЗ поставь на нормальном linux/unix - сервере.
Здесь есть темы про бесплатный хостинг для Drupal- поищи.

Аватар пользователя DoNotSecret DoNotSecret 10 ноября 2015 в 11:45

прочитал вашу дискусию

млин у меня уже мозг кипит Sad

поправил $cookie_domain = "example.com";

вставил ->

function custom_url_rewrite_outbound(&$path, &$options, $original_path) {
 
    // 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
...

но остается еще два косяка

на момент написания сообщения остались следующие траблы ->

Аватар пользователя afishi afishi 19 апреля 2009 в 12:42

итак прописанный от 0 до конца как и что делать не пробовали?
с вариантами для чего что надо и где это все лежит?

Аватар пользователя afishi afishi 21 апреля 2009 в 0:14

red_ukr wrote:
Уря! разобрался!!! ))) все работает )))

Если кому нужна помощь в установке - пишите. с радостью помогу )))


НЕТ!!!
неправильный ответ!
распишите, что и как делали и что получилось!

Аватар пользователя venom280@drupal.org venom280@drupal.org 21 апреля 2009 в 14:01

afishi wrote:

НЕТ!!!
неправильный ответ!
распишите, что и как делали и что получилось!

Комментарий бы получился большим поэтому для тех кто этот модуль еще не настроил, сделал запись http://drupal.ru/node/28458

Аватар пользователя CTPAHHuK CTPAHHuK 9 июля 2009 в 18:34

Коллеги, попытки поставить данный модуль закончились тем, что в отлогиненном состоянии все работает как должно, а в залогиненном вываливает
Fatal error: Call to undefined function: subdomain_url_rewrite_inbound()
В каком направлении копать?

Аватар пользователя CTPAHHuK CTPAHHuK 10 июля 2009 в 10:30

ну вообщето 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

Вот както так.

Аватар пользователя CTPAHHuK CTPAHHuK 21 июля 2009 в 11:23

Забил я на данный модуль, решил задачу средсвами nginx и алиасами.
nginx изменяет урл типа subdomain.domain.ru на domain.ru/subdomain/ на где /subdomain алиас на нужную мне ноду

Аватар пользователя afishi afishi 23 июля 2009 в 3:18

типа 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 (Файл не найден).

Аватар пользователя CTPAHHuK CTPAHHuK 13 августа 2009 в 18:25

Нет, не так.
Задача была несколько иного плана.
Решено реврайтами
Пользователь идет на vasya.domain.ru URL меняется на domain.ru/vasya в друпале соответсвенно алиас vasya назначен нужной ноде
Хотя в описании модуля субдоменов какраз такая ситуация и описана, за исключением того, что УРЛ реально не перезаписывается в отличии от реврайтов.

Аватар пользователя afishi afishi 13 августа 2009 в 19:11

Еще раз.
ребята.
как сделать только для выбранных NODE становилась ляля.сайт.ру
т.е.
http://сайт.ru/?q=node/8026 показывался как http://8026.сайт.ru
или
http://сайт.ru/?q=node/koka показывался как http://koka.сайт.ru

Аватар пользователя CTPAHHuK CTPAHHuK 14 августа 2009 в 14:12

Можно более подробно?
Нужно чтоб пользователь набирая адрес http://koka.сайт.ru попадал на ноду http://сайт.ru/?=node/koka ?
Вас не будет смущать, если пользователь набрав http://koka.сайт.ru попадет на нужную ноду но в адресной строке браузера увидит http://сайт.ru/koka ?
Я реализовал последний вариант, мне тоже нужно было переадресовывать пользователя в определенные ноды по имени субдомена
Реализовано через конфиг nginx-а и алиасы друпала
Если вас устраивает такой вариант, опишу как его реализовать

Аватар пользователя afishi afishi 14 августа 2009 в 15:01

мне не страшно. это поможет для развития поисковиов и для раздачи среди заведений - и размещения а в СМИ таких ссылок клуб.сайт.ру
давайте начнем!

Аватар пользователя CTPAHHuK CTPAHHuK 14 августа 2009 в 16:30

Поскольку сайт реально у нас один, опущу бОльшую часть конфига, привожу непосредственно необходимый нам кусок
Как отмечалось выше, нужно сказать nginx-у что у него все хосты в домене, для этого в блоке server пишем:

           server_name domain.ru
                        *.domain.ru
                        xxx.xxx.xxx.xxx;  //IP сервера

Далее в этомже блоке (с пояснениями ниже каждого куска):

                    if ($host ~ ^domain.ru$){
                        rewrite  ^(.*)$ http://www.domain.ru$1  permanent;
                        break;
                    }

Если имя хоста полученного nginx-ом domain.ru (четкое совпадение) - то перезаписываем URL запроса в http://www.domain.ru/если_чтото_было_то_добавляем

                    if ($host ~* ^(?!www)([a-z0-9_]+)\.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_]) может состоять из латинских букв, цифр и знака подчеркивания (стандартный регексп)

                    if ($host ~* ^www.([a-z0-9_]+)\.domain.ru$) {
                        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

Наслаждаемся.

Аватар пользователя dobradmin dobradmin 16 ноября 2009 в 10:22

Парни вопрос а с 6.14 он корректно работает?
а то вот есть VDS на дебиане, с плеском
и вроде все по инструкции сделал но не проходит тест сервера, хотя wildcart прописан(не через плеск - руками прописал)
и что интересно не проходит "Drupal's inbound URL rewriting", а вторую функцию все ок. при том что обе функции прописаны в settings.php

Аватар пользователя myxaska myxaska 17 января 2011 в 16:49

Тоже с бьюсь колочусь, не получается. Помогите пожалуйста или поясните как настроить субдомены в следующей ситуации:

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.