Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

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

Komentáře

  1. Jakub Bouček http://www.jakub-boucek.cz/ #1

    avatar

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

    před 7 lety
  2. Kenn http://Opicinoviny #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 7 lety
  3. karf http://www.karf.cz #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 7 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 7 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 7 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 7 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 7 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 7 lety
  9. tiso http://tiso.wz.cz/ #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 7 lety | reagoval [19] golf
  10. Martin Pešava http://www.pesava.cz/ #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/

    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 http://www.pesava.cz/ #11

    avatar

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

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

    avatar

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

    před 7 lety
  13. karf http://www.karf.cz #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 7 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 7 lety | reagoval [17] nesro [29] Matej
  15. cniry #15

    avatar

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

    před 7 lety
  16. ic http://icweb.eu #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 7 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 7 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 7 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 7 lety
  20. optik http://mirin.cz #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 7 lety | reagoval [22] Marek Hrabě
  21. Oswald http://www.webkitchen.cz/ #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 7 lety | reagoval [30] pmajster
  22. Marek Hrabě #22

    avatar

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

    před 7 lety | reagoval [23] optik
  23. optik http://mirin.cz #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 7 lety
  24. v6ak http://v6ak.profitux.cz/ #24

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

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

    asi byste potrebovali toto :)
    http://www.peereboom.us/adsuck/

    před 7 lety
  26. Čuga http://www.divDesign.cz #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 7 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 7 lety | reagoval [28] pokusnicek [31] Dragonn
  28. pokusnicek #28

    #27 Forrest79, japato?

    před 7 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 7 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 7 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 7 lety
  32. jtousek http://m33.cz/ #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 7 lety
  33. Honza #33

    Výborný článek, moc mi pomohl :-)

    před 6 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 5 lety

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