Na navigaci | Klávesové zkratky

Heuréka: example.l na localhost

Mám ve zvyku vyvíjet a spouštět webové aplikace na doménách s příponou .l, takže třeba vývojová verze https://nette.org mi běží na http://nette.l. Což znamená přidat do souboru hosts řádek pro každou subdoménu, např.:

nette.l   127.0.0.1
www.nette.l   127.0.0.1
forum.nette.l   127.0.0.1

To je přinejmenším otravné. Kéž by hosts podporoval zápis pomocí wildcards, stačilo by napsat

*.l   127.0.0.1

a měl bych vystaráno. Jenže tohle nefunguje. Hledal jsem proto jiné řešení. K velkému překvapení, internet se návody nejen že nehemží, nenašel jsem vůbec nic.

Bylo zřejmé, že budu potřebovat najít lokální DNS server, který toto umožní. Narazil jsem na Simple DNS Plus. Po instalaci je potřeba jej manuálně aktivovat, tj. říci síťovému připojení, že má používat DNS server na adrese 127.0.0.1. Poté přímo v aplikaci v Tools / Options / Plug-Ins vytvořit instanci pluginu Regular Expressions a určit, že maska \.l$ se bude mapovat na adresu 127.0.0.1.

Funguje to výborně, jen cena $79 mi nepřipadá odpovídající, využívám-li okrajové vlastnosti jinak našlapaného programu.

Další možností je instalace multiplatformního opensource DNS serveru BIND. Stáhl jsem si distribuci pro Windows a nainstaloval do výchozího adresáře. Ovšem zapomeňte na nějaké klikací prostředí, BIND zná jen příkazovou řádku a textové konfigurační soubory. Pro mě španělská vesnice. Naštěstí mě pohled do dokumentace neodradil rovnou a podařilo se mi vytvořit konfigurační soubory. Ty se nacházejí v podadresáři etc, v mém případě je to c:\Windows\System32\dns\etc\. Na vašem počítači může být cesta odlišná.

Soubor etc\named.conf

options {
	directory "C:\Windows\System32\dns\etc"; // změňte pokud používáte jinou cestu.
};

zone "localhost" {
	type master;
	file "localhost";
};

zone "l" {
	type master;
	file "localhost";
};

zone "0.0.127.in-addr.arpa" {
	type master;
	file "localhost.rev";
};

Sourbor etc\localhost (využívající wildcard DNS record)

$TTL	86400
@	   IN SOA   @ root (
						2005022501	  ; serial
						3H			  ; refresh
						15M			 ; retry
						1W			  ; expiry
						1D )			; minimum

		IN NS		@
		IN A		 127.0.0.1
*.l.	IN A		 127.0.0.1

a nakonec soubor etc\localhost.rev

$TTL	86400
@	   IN	  SOA	 localhost. root.localhost.  (
							2005022501	  ; serial
							3H			  ; refresh
							15M			 ; retry
							1W			  ; expiry
							1D )			; minimum

		IN	  NS	  localhost.
1	   IN	  PTR	 localhost.

Poté stačí na síťovém připojení aktivovat DNS server na adrese 127.0.0.1 (viz postup výše) a spustit službu ISC BIND. Světe div se, ono to funguje!

C:\>ping nette.l

Příkaz PING na nette.l [127.0.0.1] - 32 bajtů dat:
Odpověď od 127.0.0.1: bajty=32 čas < 1ms TTL=128

před 15 lety v rubrice PHP | blog píše David Grudl | nahoru

Mohlo by vás zajímat

Komentáře

  1. Jakub Bouček #1

    avatar

    Děkuji, to je spása!!!

    před 15 lety
  2. Kenn #2

    avatar

    Při pohledu na postup se nejspíš spokojím s localhost/mujweb :) každopádně lokální DNS zní lákavě a nejspíš ho vyzkouším.

    před 15 lety
  3. karf #3

    avatar

    Díky za tento článek. Před časem jsem si prošel stejnou cestou až k BINDu, kde mě ovšem pohled do dokumentace odradil.

    před 15 lety
  4. golf #4

    avatar

    Zdar,
    zajimavý typ. Také jsem se tím trápil. Nakonec jsem to vyřešil tak, že všechny projekty mám v adresáři …/dev/sub. Mám PHP skript, který spustím, on projde podadresáře v …/dev/sub a pro každý podadresář vytvoří konfiguraci do apache (virtual host) a zároveň zapíše subdom0nu do hosts. Pak je3t2 restartuje apache pomocí exec(apache restart). Takže celé nastavení nové subdomény spočívá ve spuštění jednoho skriptu „php server.php“

    před 15 lety | reagoval [9] tiso
  5. ZETCHA #5

    avatar

    Ještě jsem našel open source Dual DHCP DNS Server jen jsem se nedostal k tomu ho nakonfigurovat. Super je, že ho lze mít jako „portable“ a spouštět ho např z flash disku (můj případ).

    před 15 lety
  6. Jaroslav Moravec #6

    avatar

    Heuréka! Děkujeme za hotové řešení. Doteď jsem to řešil scriptem na tvorbu nového projektu, který mi zanesl všechny údaje do hosts i httpd.conf, tohle mi ještě věci zpřehlední a usnadní.

    před 15 lety
  7. Jiří Landsman #7

    avatar

    díky za řešení :) Ještě by to chtělo nějaké řešení nastavení virtualhostu abych se nemusel nastavovat ani s tim :) aby treba pro domenu .l zpristupnil soubory ve slozce D:\www :)

    před 15 lety
  8. Almad #8

    Na těch unixech jde nastavit „hledej v dns a když nenajdeš hledej na doméně X a když nenajdeš hledej na localhostu“.

    Bez dns serveru…

    před 15 lety
  9. tiso #9

    avatar

    #4 golfe, tiež používam taký skript, ale reštartoval som vždy manuálne. Netušil som že exec ide použiť aj takto (odpíliť si konár na ktorom sedíš).
    DG: užitočné, viem že Apache nie je jediný server, budem musieť vyskúšať ďalšie.

    před 15 lety | reagoval [19] golf
  10. Martin Pešava #10

    avatar

    Díky, určitě to hned vyzkouším … tušil jsem, že to nějak půjde, ale neměl jsem dosud čas to zkoušet.

    Co se týče komentářů výše, tak víte o tom, že apache umožňuje používat tzv. VirtualDocumentRoot?
    <VirtualHost *:80>
    UseCanonicalName Off
    ServerName local
    ServerAlias *.local
    VirtualDocumentRoot C:/Dokumenty/WWW-local/%1/
    </VirtualHost>

    a pak už stačí jenom správně nasměrovat DNSko a není potřeba pro každej projekt zakládat konfiguraci do httpd.conf (samozřejmě, pokud některý nepotřebuje jinak nastavený apache)

    … nicmene se to da kombinovat, takze pokud ma mit jedna domena jinou konfiguraci, muzete nejdriv udelat <virtualhost> pro neco.local a pak teprve uvest toto … apache to prochazi postupne a zastavi se pri prvni schode :)

  11. Martin Pešava #11

    avatar

    #10 Martine Pešavo, sakryš, vždyť to v tom náhledu vypadalo správně …
    … chybí tam </VirtualHost>

    před 15 lety
  12. Jiří Landsman #12

    avatar

    #10 Martine Pešavo, díky to bude přesně to co jsem hledal :)

    před 15 lety
  13. karf #13

    avatar

    #10 Martine Pešavo, Bohužel VirtualDocumentRoot nefunguje zcela transparentně – proměnná DOCUMENT_ROOT pak směřuje na skutečný, nikoliv virtuální root, takže php skript s tím musí počítat.

    před 15 lety
  14. nesro #14

    Já bych danou situaci řešil takhle:

    do souboru /etc/hosts přidám řádek s:

    127.0.0.1 nette.l

    a do souboru /etc/apache2/sites-available/default :

    <VirtualHost *:80>
    DocumentRoot /home/nesro/nettephp/
    ServerName nette.l
    < / Virtual Host > (bez mezer)

    asi to není nejlepší řešení, ale když jsem to takhle řešil já, byl jsem spokojenej. Ovšem je to řešení pro linux, ale není problém si udělat virtualbox.

    před 15 lety | reagoval [17] nesro [29] Matej
  15. cniry #15

    avatar

    super :) jdu googlit jak to udělat na linuxu

    před 15 lety
  16. ic #16

    avatar

    Používal jsem osobní DNS TreeWalk ta byla zdarma a i těch 127.0.0.1 do nastavení sítě uměla vyplnit automaticky (pokud byl program zapnut, pokud ne vrátil původní hodnotu) jenže můj slabší počítač byl tímto programam příliš zatížen tak musel z domu. Říkám si jestli není snadnější vyplnit hosts než absolvovat takovéto pokusy na lidech a jejich počítačích.

    před 15 lety
  17. nesro #17

    #14 nesro, kdyby to někdo zkoušel, tak za 127.0.0.1 musí být tabulátor, ne mezera

    před 15 lety
  18. Koubas #18

    avatar

    Pokud si nechcete rozjíždět DNS lokálně, tak si můžete podobný záznam klidně přidat do zónového souboru nějaké své domény přes administrovátko u registrátora/hostignu, např.:
    *.l A 127.0.0.1

    a pak cokoliv.l.domena.cz bude resolvit na 127.0.0.1, akorát to nebude fungovat offline.

    před 15 lety
  19. golf #19

    avatar

    #9 tiso, spouštím ten skript z příkazové řádky, takže apache se to netýká a konár na ktorom sedím sa neodpílí 🙂

    před 15 lety
  20. optik #20

    avatar

    Jen takový detail, asi by se neměla dělat konfigurace dvou domén (.localhost,.l) jedním zónovým souborem. Jinak osobně bych raději použil .test, to je myslím k tomu účelu i vyhrazené od IANY nebo tak něco. Časem možná na .l něco bude 🙂 a pak se na něj nedostaneš.

    před 15 lety | reagoval [22] Marek Hrabě
  21. Oswald #21

    avatar

    Přesně tohle jsem nedávno řešil pro linux, tady je kdyžtak návod, jak na to:

    http://blog.webkitchen.cz/virtualhosty

    před 15 lety | reagoval [30] pmajster
  22. Marek Hrabě #22

    avatar

    #20 optiku, Samozřejmě, že dostane. Jak tě mohl napadnout opak?

    před 15 lety | reagoval [23] optik
  23. optik #23

    #22 Marku Hrabě, Řekl bych, že pokud by měl to své lokální dns jako první v pořadí resolvování, tak už by se asi na nově vzniknuvší l. nedostal, vždycky by skončil na localhostu, pokud až jako druhé/další, tak se pak zase nedostane na ten svůj lokální l. Druhá věc je, že pravděpodobně to dns zapíná a vypíná jen při vývoji. Každopádně s vzniknuvším l. by to mohlo mít trochu zmatečné chování.

    před 15 lety
  24. v6ak #24

    Je jednopísmenková TLD povolena? Nejsem si jist.

    před 15 lety | reagoval [31] Dragonn
  25. pepazdepa #25

    asi byste potrebovali toto :)
    https://web.archive.org/…s:80/adsuck/

    před 15 lety
  26. Čuga #26

    avatar

    A co když to světe div se nefunguje??? :) Nainstaloval sem BIND, vytvoril konfiguracni soubory, nahodil DNS server jako 127.0.0.1 a prdlajz :) je potřeba instalovat i ten Simple DNS nebo ni???

    před 15 lety
  27. Forrest79 #27

    Ahoj,
    neví někdo jak donutit Windows, aby pokud nejsem připojenej k žádný sítí, brali v potaz lokálkní DNS server stejně jako soubor hosts? Občas se mi stane, že programuju v končinách, kde neni žádný připojení k internetu a tam je mi lokální DNS server na nic :(

    před 15 lety | reagoval [28] pokusnicek [31] Dragonn
  28. pokusnicek #28

    #27 Forrest79, japato?

    před 15 lety
  29. Matej #29

    #14 nesro, Diky, tohle mi pro zacatek bude stacit. Ale urcite casem vyzkousim i automatiku, co je popsana v clanku.

    před 15 lety
  30. pmajster #30

    avatar

    presne toto som sa snažil riešiť a nájst nejaké riešenie cez vianocne a neúspešne… a teraz som tu na to natrafil úplne náhodou :)

    moja situacia bola: chcel som na testovacie účely používať lokálne doménu .xx a aby všetko smerovala na server vo virtualboxe, kde by už ostatné riešil apache (snaha pohodlne sa priblížiť reálnej situácii- nepracovať s localhostom a mať možnosť využívat subdomény a .htaccess).
    skúšal som bind, dnsmasq, no nepodarilo sa mi úspešne do funkčného stavu nakonfigurovať ani jeden dns server, tak aby to pracovalo podľa očakávaní.

    skúsim to podľa tvojho návodu ešte raz s bind a podľa toho čo postol #21 Oswald aj s dnsmasq;)

    čo sa týka toho virtual hostingu, tak myslím že ideálne riešenie v tomto prípade by mohlo byť využitie dynamického virtuálneho hostingu, apache má na to mod_vhost_aliases, niečo nájdete napr. v tejto knihe: Linux – administrace serveru Apache, kapitola 6.4 sa zaoberá danou tématikou http://goo.gl/8MsU

    riešenie zbiehať akékoľvek skripty po zmene/vytvorení projektov mi príde dost nepraktické…

    před 15 lety
  31. Dragonn #31

    avatar

    #24 v6aku, Jednopísménné TLD nejsou povolené jako meznárodní. Klasická TLD má co já vim 2–4 znaky. Ale pro použití v privátní síti nebo na localhostu můžeš mít klidně i TLD *.jakdlouhouchces, pokud se nepletu.

    #27 Forrest79, Tohle jsem přesně nepochopil. Mělo by to fungovat tak, že ti na localhostu poběží DNS server (třeba již zmíněný bind), tvůj primární DNS server budeš mít nastavenej 127.0.0.1 a bind bude mít nastavený forward neznámých požadavků na DNS server, který jsi měl doteď.

    To, co jsem napsal Forrestovi souvisí s mým problémem a tím, proč jsem zatím ještě nezačal používat to, o čem David napsal. Můj prakticky jediný používaný počítač je notebook a s ním přecházím mezi třemi poskytovateli internetu, někdy i více. Některé připojení mám nastavené staticky a jiné dynamicky od DHCP serveru. Když v systému nastavím dns server na localhost mám teďko dva problémy:

    1. jak bind zjistí, jaký dns server si má nastavit, když mu to řekne až dhcp server v konkrétním míste připojení?
    2. jak zabezpečit, aby mi dhcp klient automaticky nepřepisoval resolv.conf (nastavení dns serverů)?

    Prozatím ručně edituji /etc/hosts, protože nevytvářím subdomény tak často. Zároveň, pokud by někdo měl zájem, tak používám virtual document root v apache2:

    DocumentRoot /home/dragonn/web
    UseCanonicalName Off
    VirtualDocumentRoot /home/dragonn/web/%-2/www

    před 15 lety
  32. jtousek #32

    Netuším, co dělám špatně, ale nemohu spustit tu službu ISC BIND, pořád to hází chybu 1069 = chyba přihlášení.

    před 15 lety
  33. Honza #33

    Výborný článek, moc mi pomohl 🙂

    před 14 lety
  34. Pavol Biely #34

    avatar

    Jednoduché riešenie, ktoré umožní zapisovať hostnames ako 127.0.0.1 *.l je použitie programu Acrylic

    Stačí ho zapnúť ako službu a nastaviť si primárne DNS na 127.0.0.1.

    před 13 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.