Поддомены с подстановочными знаками

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

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

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

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

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

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

stackoverflow.com/questions/1562954/…
Chris Stryczynski 02.10.2018 13:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
1
31 482
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

First, I want to allow users to publish pages and give them each a subdomain of their choice (ex: user.mysite.com). From what I can gather, the best way to do this is to map user.mysite.com to mysite.com/user with mod_rewrite and .htaccess - is that correct?

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

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

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>
Ответ принят как подходящий

Что касается того, как настроить подстановочный знак поддомена 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. Их инструкции по настройке такие:

Yes, you can configure a wild card but it will only work if you set it up as an A Record. Wildcards do not work with a C Name. To use a wildcard, you use the astericks character '*'. For example, if you create and A Record using a wild card, .domain.com, anything that is entered in the place where the '' is located, will resolve to the specified IP address. So if you enter 'www', 'ftp', 'site', or anything else before the domain name, it will always resolve to the IP address

У меня есть некоторые, которые настроены именно таким образом, когда * .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-адресу и выполняете соответствующее действие в своем коде.

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

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

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

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

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

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

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

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

На вашем локальном компьютере для тестирования вам также придется настроить поддельные 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 [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 [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 [R]
</VirtualHost>

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

  1. Если на вашем сервере есть cPanel, создайте поддомен *, если нет, вам придется настроить запись A в своем DNS (для BIND см. 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 для проверки заголовка «Host» и определения поддомена и соответствующего обслуживания содержимого.

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

    #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-адрес.

Я выполнил твои инструкции. Проблема в том, что всякий раз, когда применяются настройки, мой интернет отключается. Я опубликовал то, чего хочу достичь, на stackoverflow.com/questions/42857061/…. Как я могу это сделать?

Subrata Sarkar 17.03.2017 17:11

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

Fery Wardiyanto 17.03.2017 17:17

Это решение решило мою проблему. Как ни странно, я обычно пропускаю шаг 3 и все еще работаю, но теперь мне нужно отредактировать файл dhclient.conf. Спасибо, приятель, ты экономишь мое время. (опять таки) :)

Mokhamad Rofi'udin 01.09.2019 04:21

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

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