Поддомейни със заместващи знаци

Знам, че имаше няколко теми по този въпрос преди, но опитах абсолютно всичко предложено (което можах да намеря) и досега нищо не ми помогна...

Имайки това предвид, ето какво се опитвам да направя:

Първо, искам да позволя на потребителите да публикуват страници и да им дам поддомейн по техен избор (напр. user.mysite.com). От това, което мога да разбера, най-добрият начин да направите това е да картографирате user.mysite.com към mysite.com/user с mod_rewrite и .htaccess - правилно ли е?

Ако това е правилно, може ли някой да ми даде изрични инструкции как да направя това?

Освен това правя цялата си разработка локално, използвайки MAMP, така че ако някой може да ми каже как да настроя локалната си среда да работи по същия начин (прочетох, че това е по-трудно), ще съм много благодарен. Честно казано, опитвах всичко без резултат и тъй като за първи път правя нещо подобно, съм напълно изгубен. Благодаря много за всякаква помощ!

Актуализация: Някои от тези отговори бяха НАИСТИНА полезни, но за системата, която имам предвид, ръчното добавяне на поддомейн за всеки потребител не е опция. Това, което наистина питам, е как да направя това в движение и да пренасоча wildcard.mysite.com към mysite.com/wildcard -- начинът, по който е настроен Tumblr, е перфектен пример за това, което бих искал да направя. Благодаря отново!


person beaudeal    schedule 17.09.2008    source източник
comment
stackoverflow.com/questions/1562954/   -  person Chris Stryczynski    schedule 02.10.2018


Отговори (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. Техните инструкции за настройка на това са следните:

Да, можете да конфигурирате заместваща карта, но тя ще работи само ако я настроите като A Record. Заместващите символи не работят с C име. За да използвате заместващ знак, използвайте знака звездичка '*'. Например, ако създадете Запис с помощта на заместващ знак, .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 адреса и да предприемете подходящото действие във вашия код.

person Ryan Farley    schedule 17.09.2008

Най-доброто нещо, което можете да направите, ако използвате *AMP, е да направите това, което Томас предлага и да направите виртуални хостове в Apache. Можете да направите това със или без пренасочването, което описвате.

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

Най-вероятно ще искате да направите базирани на имена виртуални хостове, тъй като е най-лесният за настройка и изисква само един IP адрес (така че ще бъде лесен за настройка и тестване на вашата локална MAMP машина). Базираните на IP виртуални хостове са по-добри в някои други отношения, но трябва да имате IP адрес за всеки домейн.

Тази страница в Уикипедия обсъжда разликите и връзки към добра основна стъпка за това как да направите name- базирани 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>
person joelhardi    schedule 17.09.2008

Осъзнавам, че доста късно отговарям на този въпрос, но имах същия проблем по отношение на решение за локално развитие. В друга 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 за повече информация

person Beau    schedule 26.11.2012

Аз съм на Ubuntu 16.04 и от 14.04 използвам решение, предоставено от Dave Evans тук и работи добре за мен.

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

person Fery W    schedule 03.12.2016
comment
Следвах вашите инструкции. Проблемът е, че когато се приложат настройките, интернетът ми спира. Публикувах какво искам да постигна на stackoverflow.com/questions/42857061/. Как мога да направя това? - person Subrata Sarkar; 17.03.2017
comment
Съжалявам за това и за съжаление нямам проблем с конфигурацията, дори интернетът ми не работи. - person Fery W; 17.03.2017
comment
Това решение реши моя проблем. Малко странно, обикновено пропускам стъпка 3 и продължавам да работя, но сега трябва да редактирам файла dhclient.conf. Благодаря ти приятел, спестяваш ми времето. (отново) :) - person Mokhamad Rofi'udin; 01.09.2019

Трябваше да направя точно същото за един от моите сайтове. Можете да следвате следните стъпки

  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“ и да откриете поддомейна и съответно да сервирате съдържание.

person Arvind Gupta    schedule 01.08.2010

Първо, искам да позволя на потребителите да публикуват страници и да им дам поддомейн по техен избор (напр. user.mysite.com). От това, което мога да разбера, най-добрият начин да направите това е да картографирате user.mysite.com към mysite.com/user с mod_rewrite и .htaccess - правилно ли е?

Може да е по-добре да използвате виртуални хостове. По този начин всеки потребител може да има конфигурация на уеб сървър, почти независима от другите.

Синтаксисът е нещо подобно:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>
person Thomas    schedule 17.09.2008

От това, което съм виждал на много уеб хостове, те настройват виртуален хост на apache.

Така че, ако вашият www.mysite.com се обслужва от /var/www, можете да създадете папка за всеки потребител. След това съпоставете виртуалния хост към тази папка.

С това и mysite.com/user, и user.mysite.com работят.

Що се отнася до вашата тестова среда, ако сте на Windows, бих предложил да редактирате вашия HOSTS файл, за да картографирате mysite.com към вашия локален компютър (127.0.0.1), както и всички поддомейни, които сте задали за тестване.

person Scott Swezey    schedule 17.09.2008

Решението, което намерих за 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
person Nicolay77    schedule 21.08.2018