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





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 - это то, что использовалось. Тогда я могу:
Имеет ли это смысл? У меня есть несколько сайтов, настроенных именно так: создайте подстановочный знак для домена с хостом 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 (чтобы 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/ * - но с точки зрения безопасности это очень плохо пахнет.
Лучше быть более явным и настроить раздел конфигурации виртуального хоста для каждого имени хоста, которое вы хотите прослушивать, и поместить правила перезаписи для каждого из этих имен хоста в его конфигурацию виртуального хоста. (Всегда безопаснее и быстрее помещать такие вещи в конфигурацию 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>
Мне пришлось сделать то же самое для одного из моих сайтов. Вы можете выполнить следующие шаги
Если на вашем сервере есть cPanel, создайте поддомен *, если нет, вам придется настроить запись A в своем DNS (для BIND см. http://ma.tt/2003/10/wildcard-dns-and-sub-domains/). На вашем dev. сервер, вам будет гораздо лучше подделать поддомены, добавив каждый из них в свой файл hosts.
(Если вы использовали 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>
Далее, поскольку вы можете использовать сценарий 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 я использую решение, предоставленное Дейвом Эвансом здесь, и оно отлично работает для меня.
Установите dnsmasq
sudo apt-get install dnsmasq
Создайте новый файл localhost.conf в каталоге /etc/dnsmasq.d со следующей строкой
#file /etc/dnsmasq.d/localhost.conf
address=/localhost/127.0.0.1
Отредактируйте /etc/dhcp/dhclient.conf и добавьте следующую строку
prepend domain-name-servers 127.0.0.1;
(Вы, вероятно, обнаружите, что эта строка уже есть, и вам просто нужно ее раскомментировать.)
Последний - перезапуск службы
sudo systemctl restart dnsmasq
sudo dhclient
Наконец, вы должны проверить, работает ли он.
dig whatever.localhost
Примечание:
Если вы хотите использовать его на своем веб-сервере, вам нужно просто изменить 127.0.0.0 на свой фактический IP-адрес.
Я выполнил твои инструкции. Проблема в том, что всякий раз, когда применяются настройки, мой интернет отключается. Я опубликовал то, чего хочу достичь, на stackoverflow.com/questions/42857061/…. Как я могу это сделать?
Извините за это, и, к сожалению, у меня нет проблем с конфигурацией, даже мой интернет не работает.
Это решение решило мою проблему. Как ни странно, я обычно пропускаю шаг 3 и все еще работаю, но теперь мне нужно отредактировать файл dhclient.conf. Спасибо, приятель, ты экономишь мое время. (опять таки) :)
Решение, которое я нашел для Ubuntu 18.04, похоже на Вот этот, но включает конфигурацию NetworkManager:
Отредактируйте файл /etc/NetworkManager/NetworkManager.conf и добавьте строку dns=dnsmasq в раздел [main].
sudo editor /etc/NetworkManager/NetworkManager.conf
должно выглядеть так:
[main]
plugins=ifupdown,keyfile
dns=dnsmasq
...
Начните использовать resolv.conf NetworkManager
sudo rm /etc/resolv.conf
sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
Создайте файл с конфигурацией подстановочного знака
echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf
Перезагрузите конфигурацию NetworkManager
sudo systemctl reload NetworkManager
Проверь это
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