Поддомены С Подстановочными Знаками


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

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

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

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

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

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

8 17

8 ответов:

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

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

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

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

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

Да, вы можете настроить дикую карту, но он будет работать только в том случае, если вы настроите его как запись. Подстановочные знаки не работают с именем. Чтобы использовать подстановочный знак, вы используйте символ звездочки'*'. Для например, если вы создаете и записываете используя дикую карту, . domain.com, все, что вводится в это место где находится '', разрешится на указанный IP-адрес. Так что если вы введите "www", "ftp", "сайт" или что-нибудь еще перед доменным именем, он всегда будет разрешаться в 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 и принятия соответствующих действий в коде.

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

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

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

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

На вашем локальном компьютере для тестирования вам также придется настроить поддельные DNS-имена в /etc / hosts для ваших поддельных тестовых доменных имен. то есть, если у вас есть Apache, слушающий на localhost и настроенный vhost1.тест.домен и vhost2.тест.домен в ваших конфигурациях 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), то вам также нужно будет сделать перезапись, чтобы соответствовать поддомену и перенаправить это:

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

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

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

Все вместе, vhosts и redirect

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

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

VMware принадлежит домен wild card, который разрешает любой поддомен до 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 для получения дополнительной информации

Я нахожусь на 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. Если у вас есть cPanel на вашем сервере, создайте поддомен *, если нет, вам придется настроить запись A в DNS (для привязки см. http://ma.tt/2003/10/wildcard-dns-and-sub-domains/). на вашем dev. сервер вам было бы гораздо лучше подделать поддомены, добавив каждый из них в свой файл 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 скрипт для проверки заголовка "хост" и узнать поддомен и обслуживать контент соответственно.

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

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

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

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

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

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

С этим, оба mysite.com/user и еще user.mysite.com работает.

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

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

    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