This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

W trakcie tworzenia strony internetowej oczywistą sprawą jest to, że chcielibyśmy przetestować, jak nasz produkt będzie sprawował się w środowisku produkcyjnym. Instalujemy więc lokalnie serwer testowy [np. WAMP, XAMPP] tak, aby wersje poszczególnych komponentów “pasowały” do tych, które będą obecne na serwerze docelowym. W ten sam sposób dostosowujemy też konfigurację tychże, tak, aby przeprowadzana symulacja była maksymalnie zgodna [np. ustawienia dotyczące register_globals czy magic_quotes_gpc - czasem można trafić na “ciekawy” serwer produkcyjny, stąd trzeba zadbać o wszystkie, nawet przestarzałe / zdeprecjonowane możliwości]. Dumni z siebie uruchamiamy serwer i wpisujemy w przeglądarce http://localhost/NaszProjekt/trunk/web/index.php…

Wstęp.

…i patrzymy na dosyć mało “apetyczny” adres naszego jakże wspaniałego projektu. Biorąc pod uwagę to, że nasz [jakże wspaniały] klient prawdopodobnie będzie chciał, żeby “zainstalować” jego nową stronę pod [jakże wspaniałym] adresem http://klient.com/ nasz “localhost” wygląda “mocno średnio” - dodatkowo kopiując gdziekolwiek lokalny adres testowy będziemy mieli bardzo duży narzut na pierwszą, “domenową” część linka. Jak można temu zaradzić?

Na czym to polega?

Oczywiście można wykorzystać tytułowe wirtualne hosty. ;] Wirtualne hosty [ang. virtual hosts lub po prostu vhosts] to sposób na tworzenie własnych "wirtualnych domen", które będą dostępne tylko na naszym komputerze. Oczywiście przy pewnych bardziej zaawansowanych konfiguracjach możliwy jest także dostęp "z zewnątrz", jednak w tym wpisie pozwolę sobie pominąć ten aspekt.

Jeśli nie słyszeliście jeszcze takiego pojęcia i myślicie, że nie mieliście z nim nigdy do czynienia, to muszę wyprowadzić Was z błędu - bo jeśli korzystaliście z wcześniej wspomnianego lokalnego serwera, to korzystaliście także z hosta jakim jest sam http://localhost/. Jak łatwo można zauważyć dostęp do tworzonej domeny mamy pod adresem http://[nazwa]/, jedyna różnica polega na tym, że zamiast odwoływać się do zewnętrznego serwera cała komunikacja zamyka się w ramach naszego komputera.

Myślę, że nie potrzeba więcej wyjaśnień - przejdźmy do praktyki. Aby stworzyć własny wirtualny host będziemy musieli przejść przez kilka prostych kroków, które zostały opisane poniżej.

/etc/hosts

Pierwszym krokiem będzie dodanie wpisu hosta w pliku /etc/hosts - zawiera on listę rozpoznawalnych "nazw" i odpowiadające im adresy IP - w systemie Windows znajduje się on w drzewie:
[dysk]:\WINDOWS\system32\drivers\etc
Oczywiście [dysk] to litera partycji systemowej. Jeśli wcześniej nie wprowadzaliście w nim żadnych zmian, to jest bardzo duża szansa, że będzie wyglądał tak:
# Copyright (c) 1993-1999 Microsoft Corp.
#
# To jest przykładowy plik HOSTS używany przez Microsoft TCP/IP
# w systemie Windows.
# Ten plik zawiera mapowania adresów IP na nazwy komputerów
# Każdy wpis powinien być w osobnej linii.
# W pierwszej kolumnie powinny być umieszczone adresy IP, a następnie
# odpowiadające im nazwy komputerów. Adres i nazwa powinny być oddzielone
# co najmniej jedną spacją
#
# Dodatkowo, komentarze (takie jak te) można wstawiać w poszczególnych
# liniach lub po nazwie komputera, oznaczając je symbolem '#'.
#
# Na przykład:
#
#      102.54.94.97     rhino.acme.com          # serwer źródłowy
#       38.25.63.10     x.acme.com              # komputer kliencki x

127.0.0.1       localhost

Jak widać sam plik zawiera wyjaśnienie celu swojego istnienia oraz posiadanej zawartości, także nie będę duplikował materiałów. ;] Warto jednak zauważyć, że zgodnie z wykomentowanym przykładem w nazwie tak utworzonej domeny mogą znajdować kropki, stąd nie ma żadnego problemu w mapowaniu adresu google.com na nasz lokalny serwer. ;] Przypuśćmy jednak, że nie będziemy sabotować jednej z najczęściej odwiedzanych stron na świecie i stworzymy sobie lokalnie “przykładowy” host example.com. Dodajemy więc wpis:

127.0.0.1       example.com

I voila, mapowanie załatwione. Dlaczego 127.0.0.1? Ponieważ chcemy, żeby ten adres był rozpoznawany i adresowany wewnątrz naszego komputera / systemu operacyjnego / karty sieciowej. Po prostu chcemy, żeby example.com był przypisany do tego samego serwera, ale wskazywał na inny katalog. Teraz musimy jeszcze zmusić serwer Apache do rozpoznania takiego hosta i wskazania odpowiedniego katalogu stojącego za domeną. A więc:

httpd.conf

Cała [no, prawie ;]] konfiguracja serwera Apache znajduje się w pliku httpd.conf, zaś sam plik powinien być w podkatalogu /conf instalacji [w moim przypadku [pakiet WAMP] jest on zlokalizowany w drzewie:
wamp/bin/apache/apache2.2.8/conf
Jak możemy zauważyć znajduje się w nim wiele różnych niezrozumiałych zapisów znajdują się w nim ustawienia wielu różnych elementów, ;] więc dobrze będzie trzymać nasze "dodatki" w jednym ustalonym miejscu, zamiast dopisywać je w losowych / bliżej nieokreślonych miejscach. Odszukajmy zatem linijkę:
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

Pod tą linijką umieścimy odpowiednie dyrektywy. Uprzedzam pytania - oczywiście możemy odkomentować drugą linijkę z powyższego listingu i tam wstawić nasze wpisy - kwestia wygody / gustu, ponieważ w żaden sposób nie zmieni to działania samego mechanizmu. Myślę, że podanie gotowego kodu i późniejsze objaśnienie będzie dobrym sposobem na zaprezentowanie rozwiązania, a zatem:

<VirtualHost *:80>
DocumentRoot [ścieżka]
ServerName example.com
</VirtualHost>

Fragment [ścieżka] należy oczywiście zamienić na ścieżkę bezwzględną do głównego katalogu naszego projektu [a dokładniej do katalogu zawierającego plik wykonywalny, np. index.php bądź plik .htaccess, który przekieruje nas do pliku docelowego]. Należy też pamiętać, ze w tej ścieżce musimy stosować format zapisu znany z systemów Linux / Unix, a więc każdy adres w stylu:

C:\moja\fajna\strona
musi zostać zapisany jako:
C:/moja/fajna/strona
Co się dzieje w podanym wyżej kodzie? Otóż, w pierwszej linijce wskazujemy, że właśnie rozpoczyna się deklaracja danych vhosta, który będzie dostępny z dowolnego adresu pod portem 80, czyli domyślnym dla protokołu HTTP. Następnie klauzula DocumentRoot wskazuje na żądany katalog, a ServerName ustala nazwę, pod którym dany host będzie dostępny. Znacznik zamykający elementu VirtualHost oznacza, że deklarowanie danych zostało zakończone.

Należy tutaj zauważyć, że w momencie, kiedy umieścimy taką deklarację w pliku httpd.conf to przestanie nam działać host domyślny - localhost. Aby “przywrócić” go do życia musimy go potraktować podobnie jak example.com powyżej:

<VirtualHost *:80>
DocumentRoot [ścieżka]
ServerName localhost
</VirtualHost>

Możemy teraz przejść do ostatniej, najprzyjemniejszej części. ;]

Restart serwera.

Aby wprowadzić nasze zmiany "w życie" musimy zrestartować system serwer. Aby to zrobić wystarczy skorzystać z menu kontekstowego ikonki w trayu, w przypadku WAMPa jest to pozycja "Apache -> Service -> Restart Service".

Teraz możemy się już cieszyć naszym wirtualnym hostem i testować naszą jakże wspaniałą aplikację http://localhost/NaszProjekt/trunk/web/index.php… pod adresem http://example.com/. ;] Oczywiście podana wyżej konfiguracja hosta jest najprostszą z możliwych, stąd polecam zapoznanie się z dokumentacją Apache na ten temat i dodawanie na własną rękę dyrektyw pomiędzy znacznikami VirtualHost. Oczywiście aby dodać kolejne hosty należy powtórzyć wszystkie kroki jeszcze raz [pomijając oczywiście pewne “jednorazowe” kroki, takie jak dodanie elementu VirtualHost dla serwera localhost ;]].

Podsumowanie.

Mam nadzieję, że powyższy poradnik pomoże Wam w zrozumieniu idei wirtualnych hostów oraz tworzeniu ich na własne potrzeby. Pamiętajcie jednak, żeby programować Wasze strony tak, aby były w stanie działać zarówno wywoływane z zawiłego katalogu, jak i z wirtualnego hosta - miałem okazję pracować z kilkoma skryptami, które niestety nie rozumiały "co się do nich mówiło" podczas wywołania przez ścieżkę bezpośrednią [w drugą stronę zawsze działało ;]], stąd nie nadkładajcie pracy innym [i sobie]. ;]

Przy okazji - jakie macie doświadczenia w pracy z wirtualnymi hostami? Czy korzystacie z nich przy tworzeniu projektów, czy jest to dla Was tylko zbędny dodatek do testów? Czy wykorzystujecie wirtualne hosty do innych ciekawych rzeczy? Będę wdzięczny za wszelkie opinie i informacje.