it-swarm-ru.tech

Поддомены

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

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

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

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

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

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

18
beaudeal

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

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

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

Edit:

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

Да, вы можете настроить подстановочный знак, но он будет работать только в том случае, если вы настроите его как запись A. Подстановочные знаки не работают с именем C. Чтобы использовать подстановочный знак, используйте символ звездочки '*'. Например, если вы создаете и A Record, используя подстановочный знак, . Domain.com, все, что введено в месте, где находится "", будет преобразовано в указанный Айпи адрес. Поэтому, если вы введете "www", "ftp", "site" или что-то еще до имени домена, оно всегда будет преобразовываться в IP-адрес

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

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

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

Изменить 2:

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

16
Ryan Farley

Лучше всего, если вы работаете с * 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>
13
joelhardi

Я понимаю, что довольно поздно отвечаю на этот вопрос, но у меня была та же проблема в отношении решения для локальной разработки. В еще одна 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 для получения дополнительной информации

7
Beau

Я нахожусь на 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-адрес.

3
Fery Wardiyanto

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

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

  2. (Если вы использовали cPanel, вам не придется это делать). Вам нужно добавить что-то вроде следующего в ваш файл Apache vhosts. Это во многом зависит от того, какой тип сервера (совместно используемый или нет) вы используете. СЛЕДУЮЩИЙ КОД IS НЕ ЗАВЕРШЕН. ЭТО ПРОСТО ДАТЬ НАПРАВЛЕНИЕ. ПРИМЕЧАНИЕ: 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", найти поддомен и предоставить контент соответствующим образом.

1
Arvind Gupta

Решение, которое я нашел для 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
Nicolay77

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

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

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

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

0
Scott Swezey

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

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

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

<VirtualHost *: 80> 
 DocumentRoot /var/www/user
 Имя_сервера user.mysite.com 
 ... 
 </ VirtualHost>
0
Thomas