Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Да, вы можете настроить дикую карту, но она будет работать только в том случае, если вы настроите ее как запись.Укрики не работают с именем C.Чтобы использовать подстановку, вы используете символ Astericks '*'.Например, если вы создаете и запись с использованием дикой карты, .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-адреса и выполнить соответствующее действие в своем коде.

Другие советы

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

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

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

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

На вашем локальном компьютере для тестирования вам также придется настроить поддельные DNS-имена в /etc/hosts для ваших поддельных тестовых доменных имен.то естьесли у вас есть Apache, прослушивающий локальный хост, и вы настроили 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>

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

Я использую 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 (о 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», определения субдомена и соответственного обслуживания контента.

Во -первых, я хочу позволить пользователям публиковать страницы и дать им каждому поддомену по своему выбору (например,: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.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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top