Поддомены - PullRequest
       110

Поддомены

18 голосов
/ 17 сентября 2008

Я знаю, что раньше было несколько тем на эту тему, но я попробовал абсолютно все, что мне предложили (что я мог найти), и пока у меня ничего не получалось ...

Имея это в виду, вот что я пытаюсь сделать:

Во-первых, я хочу разрешить пользователям публиковать страницы и предоставлять каждому из них поддомен по своему выбору (например, user.mysite.com). Из того, что я могу собрать, лучший способ сделать это - сопоставить user.mysite.com с mysite.com/user с помощью mod_rewrite и .htaccess - это правильно?

Если это так, может кто-нибудь дать мне четкие инструкции, как это сделать?

Кроме того, я делаю всю свою разработку локально, используя MAMP, поэтому, если кто-нибудь может сказать мне, как настроить мою локальную среду для работы таким же образом (я читал, что это труднее), я бы очень ценить это. Честно говоря, я пытался все безрезультатно, и так как я впервые делаю что-то подобное, я полностью потерян. Большое спасибо за любую помощь!

Обновление: Некоторые из этих ответов ДЕЙСТВИТЕЛЬНО полезны, но для системы, которую я имею в виду, вручную добавлять поддомен для каждого пользователя не представляется возможным. На самом деле я спрашиваю, как это сделать на лету, и перенаправить wildcard.mysite.com на mysite.com/wildcard - способ настройки Tumblr - прекрасный пример того, что я хотел бы сделать. Еще раз спасибо!

Ответы [ 8 ]

16 голосов
/ 17 сентября 2008

Что касается настройки подстановочного знака субдомена DNS, это будет функцией вашего хостинг-провайдера DNS. Это будет разные шаги в зависимости от того, какой хостинг у вас есть, и будет лучшим вопросом для них.

После того, как вы настроили это на хосте DNS, из вашего веб-приложения вы действительно просто переписываете URL, что можно сделать с помощью какого-то модуля для самого веб-сервера, такого как перезапись isapi, если вы используете IIS (это будет предпочтительный маршрут, если это возможно). Вы также можете выполнить переписывание на уровне приложения (например, используя маршрутизацию, если в ASP.NET).

Вы переписали бы URL, чтобы http://myname.domain.com стал http://domain.com/something.aspx?name=myname или что-то в этом роде. С этого момента вы просто обрабатываете его так, как если бы значение myname было в строке запроса как обычно. Имеет ли это смысл? Надеюсь, я не понял, что вы ищете.

Редактировать:

Я не предлагаю создавать поддомен для каждого пользователя, но вместо этого создайте поддомен подстановочного знака для самого домена, поэтому что-нибудь .domain.com (в основном * .domain.com) переходит к вашему сайт. У меня есть несколько доменов, настроенных с mydomain . Их инструкция по настройке выглядит следующим образом:

Да, вы можете настроить подстановочный знак, но это будет работать только если вы установите его как Запись. Подстановочные знаки не работают с именем C Чтобы использовать подстановочный знак, вы используйте символ звездочки '*'. За Например, если вы создаете и запись используя подстановочный знак, .domain.com, все, что введено в месте где находится , разрешит на указанный IP-адрес. Так что если вы введите «www», «ftp», «site» или что-нибудь еще до доменного имени, это всегда будет разрешаться на IP адрес

У меня есть некоторые, которые настроены именно таким образом, когда * .domain.com заходит на мой сайт. Затем я могу прочитать базовый URL-адрес в своем веб-приложении и убедиться, что ryan.domain.com - это то, к чему в данный момент обращались, или что bill.domain.com - то, что использовалось. Тогда я могу либо:

  1. Используйте перезапись URL, чтобы субдомен стал частью строки запроса ИЛИ
  2. Просто прочитайте значение хоста из доступного URL-адреса и выполните некоторую логику, основанную на этом значении.

Это имеет смысл? У меня есть несколько сайтов, настроенных именно таким образом: создайте шаблон для домена с DNS-хостом, а затем просто прочитайте хост или базовый домен из URL-адреса, чтобы решить, что отображать на основе субдомена (который фактически был именем пользователя). )

Редактировать 2:

Нет способа сделать это без записи DNS. «Онлайн мир» должен знать, что name1.domain.com, name2.domain.com, ..., nameN.domain.com все идут по IP-адресу вашего сервера. Единственный способ сделать это - с помощью соответствующей записи DNS. Вы должны добавить запись DNS с подстановочным знаком для вашего домена с вашим DNS-хостом. Тогда вы просто читаете поддомен из URL и предпринимаете соответствующие действия в своем коде.

13 голосов
/ 17 сентября 2008

Лучше всего, если вы работаете * AMP - это делать то, что предлагает Томас, и делать виртуальные хосты в Apache. Вы можете сделать это с описанным вами перенаправлением или без него.

Виртуальные хосты

Скорее всего, вы захотите сделать виртуальных хостов на основе имен , так как это проще всего настроить и требует только один IP-адрес (так что его также легко установить и протестировать на локальном компьютере MAMP). ). Виртуальные хосты на основе IP лучше в некоторых других отношениях, но вам необходимо иметь IP-адрес для каждого домена.

На этой странице Википедии обсуждаются различия и ссылки на хороший базовый краткий обзор того, как делать именные vhosts, в нижней части.

На вашем локальном компьютере для тестирования вам также потребуется настроить поддельные DNS-имена в / etc / hosts для ваших поддельных тестовых доменных имен. т. е. если у вас Apache прослушивает localhost и настраивает vhost1.test.domain и vhost2.test.domain в ваших конфигах Apache, вы просто добавляете эти домены в строку 127.0.0.1 в / etc / hosts после localhost:

127.0.0.1 localhost vhost1.test.domain vhost2.test.domain

Как только вы выполнили редактирование / etc / hosts и добавили конфиги виртуального хоста на основе имен в ваши файлы конфигурации Apache, все, перезапустите Apache, и ваши тестовые домены должны работать.

Перенаправление с mod_rewrite

Если вы хотите выполнить перенаправления с помощью mod_rewrite (так, чтобы user.example.com не размещался напрямую, а вместо этого перенаправлял на example.com/user), то вам также потребуется сделать RewriteCond для соответствия поддомену и перенаправления это:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com
RewriteRule ^(.*)$ http://example.com/subdomain$1 [R]

Вы можете поместить это в .htaccess или в свою основную конфигурацию Apache.

Вам нужно будет добавить пару правил, например последние два, для каждого субдомена, который вы хотите перенаправить. Или вы можете захватить поддомен в RewriteCond, чтобы использовать одно правило подстановочного знака для перенаправления * .example.com на example.com/. * - но это пахнет очень плохо для меня с точки зрения безопасности.

Все вместе, vhosts и редирект

Лучше быть более явным и настроить раздел конфигурации виртуального хоста для каждого имени хоста, которое вы хотите прослушивать, и поместить правила перезаписи для каждого из этих имен хоста в его конфигурацию виртуального хоста. (Всегда безопаснее и быстрее помещать подобные вещи в конфигурацию Apache, а не .htaccess, если вы можете помочь - .htaccess снижает производительность, потому что Apache постоянно ищет файловую систему для файлов .htaccess и анализирует их, и это менее безопасно, потому что они могут быть испорчены пользователями.)

Все вместе, вот так, конфигурация vhost внутри ваших конфигов Apache будет:

NameVirtualHost 127.0.0.1:80

# Your "default" configuration must go first
<VirtualHost 127.0.0.1:80>
  ServerName example.com
  ServerAlias www.example.com
  DocumentRoot /www/siteroot
  # etc.
</VirtualHost>

# First subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost1.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost1$1 [R]
</VirtualHost>

# Second subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost2.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
</VirtualHost>
7 голосов
/ 27 ноября 2012

Я понимаю, что довольно поздно отвечаю на этот вопрос, но у меня была та же проблема с локальным решением для разработки. В другой SO-теме я нашел лучшие решения и подумал, что поделюсь ими для тех, кто с таким же вопросом в будущем:

Подстановочный домен, принадлежащий VMware, который разрешает любой поддомен до 127.0.0.1:

.
vcap.me resolves to 127.0.0.1
www.vcap.me resolves to 127.0.0.1

или для большей универсальности 37 Компания Signals владеет доменом для сопоставления любого субдомена с любым заданным IP-адресом в определенном формате:

127.0.0.1.xip.io resolves to 127.0.0.1
www.127.0.0.1.xip.io resolves to 127.0.0.1
db.192.168.0.1.xip.io resolves to 192.168.0.1

см. xip.io для получения дополнительной информации

3 голосов
/ 03 декабря 2016

Я нахожусь на Ubuntu 16.04, а с 14.04 я использую решение, предоставленное Дейвом Эвансом здесь , и оно прекрасно работает для меня.

  1. Установка dnsmasq

    sudo apt-get install dnsmasq
    
  2. Создать новый файл localhost.conf в /etc/dnsmasq.d dir со следующей строкой

    #file /etc/dnsmasq.d/localhost.conf
    address=/localhost/127.0.0.1
    
  3. Редактировать /etc/dhcp/dhclient.conf и добавить следующую строку

    prepend domain-name-servers 127.0.0.1;
    

    (Возможно, вы обнаружите, что эта строка уже существует, и вам просто нужно раскомментировать ее.)

  4. Последний перезапустить службу

    sudo systemctl restart dnsmasq
    sudo dhclient
    

Наконец, вы должны проверить, работает ли он.

dig whatever.localhost

примечание:

Если вы хотите использовать его на своем веб-сервере, вам нужно просто изменить 127.0.0.0 на ваш фактический IP-адрес.

1 голос
/ 01 августа 2010

Мне пришлось сделать то же самое для одного из моих сайтов. Вы можете выполнить следующие шаги

  1. Если у вас есть cPanel на вашем сервере, создайте поддомен *, если нет, вам придется настроить запись A в вашем DNS (для BIND см. http://ma.tt/2003/10/wildcard-dns-and-sub-domains/). Вкл. ваш сервер разработки, вы бы гораздо лучше подделать поддоменов, добавив каждый из них в ваш файл hosts.

  2. (Если вы использовали cPanel, вам не нужно будет это делать). Вам нужно добавить что-то вроде следующего в ваш файл apache vhosts. Это во многом зависит от того, какой тип сервера (совместно используемый или нет) вы используете. СЛЕДУЮЩИЙ КОД НЕ ПОЛНЫЙ. ЭТО ПРОСТО ДАТЬ НАПРАВЛЕНИЕ. ПРИМЕЧАНИЕ: ServerAlias example.com *.example.com важно.

    <VirtualHost 127.0.0.1:80>  
            DocumentRoot /var/www/  
            ServerName example.com  
            ServerAlias example.com *.example.com  
    </VirtualHost>
    
  3. Далее, поскольку вы можете использовать PHP-скрипт для проверки заголовка «Host», поиска поддоменов и предоставления контента соответствующим образом.

0 голосов
/ 21 августа 2018

Решение, которое я нашел для Ubuntu 18.04, похоже на это , но включает конфигурацию NetworkManager:

  1. Отредактируйте файл /etc/NetworkManager/NetworkManager.conf и добавьте строку dns=dnsmasq в раздел [main]

    sudo editor /etc/NetworkManager/NetworkManager.conf
    

    должно выглядеть так:

    [main]
    plugins=ifupdown,keyfile
    dns=dnsmasq
    ...
    
  2. Начните использовать resolv.conf NetworkManager

    sudo rm /etc/resolv.conf
    sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
    
  3. Создайте файл с конфигурацией подстановочного знака

    echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
    
  4. Перезагрузить конфигурацию NetworkManager

    sudo systemctl reload NetworkManager
    
  5. Проверьте это

    dig localdomain.localhost
    

Вы также можете добавить любой другой домен, весьма полезный для некоторых типов аутентификации при использовании локальной настройки разработки.

echo 'address=/.local-dev.workdomain.com/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/workdomain-wildcard.conf

Тогда это работает:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1
0 голосов
/ 17 сентября 2008

Из того, что я видел на многих хостингах, они настраивают виртуальный хост на apache.

Так что, если ваш www.mysite.com обслуживается из / var / www, вы можете создать папку для каждого пользователя. Затем сопоставьте виртуальный хост с этой папкой.

При этом работают и mysite.com/user, и user.mysite.com.

Что касается вашей тестовой среды, если вы находитесь в Windows, я бы предложил отредактировать ваш файл HOSTS для сопоставления mysite.com с вашим локальным ПК (127.0.0.1), а также с любыми поддоменами, которые вы настроили для тестирования.

0 голосов
/ 17 сентября 2008

Во-первых, я хочу разрешить пользователям публиковать страницы и дать им каждый поддомен по своему выбору (например: user.mysite.com). Из того, что я могу собрать, лучший способ сделать это, чтобы сопоставьте user.mysite.com с mysite.com/user с mod_rewrite и .htaccess - есть это правильно?

Вам может быть лучше использовать виртуальных хостов . Таким образом, каждый пользователь может иметь конфигурацию веб-сервера, в значительной степени независимую от других.

Синтаксис выглядит примерно так:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>
...