Jak na statické stránky

Pachollini, 4. prosince 2004, 14:21

Nedávno jsem se dostal při tvorbě webu do situace, která je pro mne poněkud netypická: potřeboval jsem udělat web, který bude statický. Hlavním důvodem byla cena hostingu – pokud člověk požaduje skriptování, navíc se slušnou podporou pro práci s XML a XSLT, zaplatí obvykle násobek toho, co stojí hosting bez skriptování. A pro jednoduchou prezentaci statické stránky stačí, takže nač platit stovky korun ročně navíc.

Začal jsem tedy zkoumat, jak to provést, aby se takové stránky dobře tvořily a udržovaly, tedy abych mohl měnit společné části na jednom místě, aby se mi menu, mapa stránek a další navigační prvky generovaly automaticky atd. První možností, o které jsem přemýšlel, byl textový preprocesor PPWizard, na který jsem četl spoustu chvály a o kterém navíc Jan Bien napsal seriál na Intervalu.cz. Použití PPWizardu by pro mne však mělo několik zásadních nevýhod. První z nich je, že bych ho musel instalovat, a učit se ho používat, což by určitě zabralo spoustu času. Druhou nevýhodou je, že spoustu věcí, které při tvorbě webu používám, mám už vyřešených v PHP a při použití PPWizardu bych je musel řešit znovu, případně hledat, zda je už někdo vyřešil. Jsem zvyklý používat objekty, pracovat s XML a XSLT, využívat obrovské množství funkcí, které jsou v PHP k dispozici a tohle všechno by mi určitě dříve či později chybělo. A navíc, pokud budu mít stránky v PHP, případný přechod ze statických stránek na dynamické bude velmi snadný. Moje volba je tedy celkem jasná (což nevypovídá ani tak o kvalitách PPWizardu, jako spíš o mně).

Dobrá tedy, pro tvorbu stránek použiji PHP, ale jak to udělat, abych měl na výstupu statické stránky? Mohl bych napsat v PHP systém, který vygeneruje statické soubory webových stránek. Anebo bych mohl takový systém najít, stáhnout a použít. Obé ovšem obnáší relativně dost práce a případný přechod na dynamické generování stránek by znamenal další spousty úprav. Ideální by bylo řešení, které by u mne v počítači generovalo stránky dynamicky se vším všudy (tj. běželo by jako normální webový server) ale tak, aby se daly snadno přehrát na server jako statická prezentace. To znamená mít jednak vhodnou strukturu URL a jednak nějaký nástroj, který umožní dostatečně pružně vytvořit lokální kopii serveru. Protože používám server Apache, dá se k prvnímu použít mod_rewrite a na lokální kopie webových serverů je tu skvělý HTTrack. Co dál?

Postup

První krok: nastavení systému

Předpokladem je nainstalovaný webový server Apache s podporou PHP. Na něm je třeba kvůli elegantní práci s odkazy zprovoznit podporu virtuálních serverů a mod_rewrite a přidat virtuální server s chystanou webovou prezentací, nazvěme ji originálně třeba „l-firma“. Na Windows s Apache 1.3.x toho lze docílit nějak takto:

  1. Do konfiguračního souboru Apache httpd.conf přidáme následující kód:
    NameVirtualHost 127.0.0.1
    <VirtualHost 127.0.0.1>
        ServerName l-firma
        DocumentRoot e:/www/firma.cz
        Options All MultiViews
    </VirtualHost>
    Tím řekneme Apachi, že kořenový adresář virtuálního serveru l-firma je v adresáři e:/www/firma.cz.
  2. Když už jsme u konfigarace Apache, zapneme podporu mod_rewrite a možnost konfigurace pomocí souboru .htacces:
    LoadModule rewrite_module modules/mod_rewrite.so
    AddModule mod_rewrite.c
    AccessFileName .htaccess
    <Directory />
        AllowOverride All
    </Directory>
    Nastavení <Directory> už v souboru httpd.conf bude, takže je třeba ho změnit, eventuálně přidat nastavení jen pro příslušný adresář našeho nového webu:
    <Directory "e:/www/firma.cz">
        AllowOverride All
    </Directory>
  3. Ještě je třeba říci Windows, že požadvky na server „l-firma“ mají směřovat na Apache, který běží na našem počítači. K tomu je třeba (ve Windows XP) přidat do souboru c:\windows\system32\drivers\etc\hosts následující řádek:
    127.0.0.1 l-firma
    Nyní by po restartu Apache mělo vše fungovat tak, že po zadání adresy http://l-firma/pokus.html do browseru vrátí server soubor e:\www\firma.cz\pokus.html. Pokud to nefunguje, asi je někde chyba. V takovém případě mne prosím nekamenujte, nejsem expert na konfiguraci čehokoliv a pokud přijdete na to, kde je v návodu chyba, budu vděčný.
  4. Do adresáře e:\www\firma.cz\ umístíme soubor s názvem .htacces a následujícím obsahem:
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^.*/$
    RewriteRule ^(.*)/$ /index.php?path=$1 [L]
    Tento soubor pravidel způsobí, že pokud si vyžádáme např. adresu http://l-firma/produkty/plysovi-medvedi/, pošle nám server místo toho výsledek skriptu http://l-firma/index.php?path=produkty/plysovi-medvedi. Jinými slovy, všechny požadavky, které budou končit lomítkem, tedy budou vypadat jako „výpis adresáře“, se zpracují skriptem index.php.

Druhý krok: tvorba „motoru“ stránek

Nyní je na řadě tvorba samotného webu. Vytvoříme mechanismus, kterým ve skriptu index.php zpracujeme požadavek na danou stránku, s využitím všech možností PHP, které mohou obnášet generování navigace z XML, vkládání opakujících se prvků stránky z externích souborů, natahování obsahu z databáze etc. – fantasii se meze nekladou. Důležité je, aby všechny stránky, které se na webu nacházejí, měly „statickou“ adresu, v našem případě tedy končily lomítkem. Je samozřejmě možné použít i koncovku .html, ale mně osobně připadá „adresářový“ způsob nejpraktičtější, protože umožňuje v budoucnu snadno rozšiřovat web do hloubky a přitom se nezmění adresa současných stránek.

Třetí krok: vytvoření statické kopie webu

Když je web hotový a vše funguje, jak má, můžeme přistoupit k poslednímu kroku: vytvoření statické kopie webu. Postup je úplně stejný, jako kdybychom chtěli stáhnout stránky z internetu: tedy spustíme (Win)HTTrack, vytvoříme nový projekt a jako URL zadáme http://l-firma/. V nastavení stahování v záložce „Experts Only“ nastavíme políčko „Rewrite links: internal / external“ na hodnotu „Original URL / Original URL“. Tím způsobíme, že HTTrack nebude přepisovat adresy odkazů, tedy nepřepíše nám <a href="/produkty/"> na <a href="/produkty/index.html">. Poté už jenom stáhneme web někam na disk (uloží se pěkně v adresářové struktuře) a nahrajeme jej na náš levný hosting.

Výhody a nevýhody

Uvedený postup má mnoho výhod. Umožňuje použít všechny funkce PHP, eventuálně databázi, vygenerované stránky mají URL zcela nezávislá na použité platformě a navíc logicky strukturovaná, přechod na dynamické generování je velmi snadný: stačí nahrát hotové skripty na server a nastavit mod_rewite a uživatel na první pohled nic nepozná. Na druhou stranu jsem narazil i na pár drobných nevýhod. Největší z nich je, že pokud se ve webu objeví nějaký chybný odkaz, je velmi obtížné ho objevit a navíc se mi párkrát stalo, že se HTTrack dostal do (skoro) nekonečné smyčky. Rovněž není nijak ošetřena aktualizace stránek na serveru, takže nezbývá než pokaždé nahrát na server všechny html soubory nebo se spolehnout na synchronizační funkce některého FTP klienta.

Asi není třeba dodávat, že použití stejného systému (tedy hlavně mod_rewrite pro vytvoření struktury webu) si své výhody zachovává i u webů generovaných dynamicky.

Co vy na to?

[1] šikovné

Jan Bien, 4. prosince 2004, 15:01 http://www.mraveniste.org/

Velmi pěkně zdokumentovaný a šikovný postup. Musím uznat, že jsem PHP v kombinaci s nějakým způsobem uložení výstupu na disk poměrně hodně podceňoval. Díky za inspiraci.

[2]

Petr, 4. prosince 2004, 15:09 http://dejepis.info

A koukal si se do toho souboru co HTTrack vygeneruje? Je trochu jiný od originálu. (Alespoň ta verze, co jsem používal před asi 5 měsíci to upravovala)

[3] Změny na výstupu

Pachollini, 4. prosince 2004, 16:16

Ad [2]: HTTrack mi tam přidá HTML komentář s tím, že stránka byla stažena HTTrackem ze serveru l-firma, což mi nevadí, jinak nic. Důležité je nastavit, aby se nepřepisovaly adresy odkazů, jinak se upraví pro lokální prohlížení.

[4] Poslední HTTrack

Brbla, 4. prosince 2004, 17:00 http://brbla.net

Poslední verze HTTracku se mi podařilo nastavit tak, že nezanechává ani onen komentář a výsledek dodržel normy XHTML 1.0 striktní. Řešil jsem nedávno obdobný problém (web do HTML) a shodou náhod dospěl ke stejnému řešení a výsledku, který je pro mne zcela vyhovující.

[5] míra dynamičnosti

cita, 29. prosince 2004, 23:32 citadesign.site.cz

Jak moc dynamické mohou takto tvořené weby být?

mně připadaá v uvahu tak něco kde se dynamicky mnění max. jednou za den, spíš jednou za tři čtyři dny. mno a do toho okruhu spadá pořád ještě značná část webů.

well done

[6] Díííík

BoneFlute, 14. srpna 2005, 18:46

Hele, chtěl jsem Vám jen poděkovat. Trápil jsem se s tím tři dny a nemohl jsem ten mod_rewrite rozchodit. A teprva Vaše stránky mi pomohli najít chybu v nastavení Apache.

Takžej tímto dík moc.

[7]

Jan Rozehnal, 2. prosince 2005, 00:03 www.artic-studio.net

mod_rewrite mi pořád nejde, může to být verzí Apache?

Je to až po přeinstalaci systému.

Jinak dky, držím palce

[8] wget

Petr Kletečka, 12. dubna 2006, 07:29 petrkle.wz.cz/zonglovani

Zkuste wget. Vytváří záznam o stažených souborech. V něm najdete neplatné odkazy.

.htaccess

ErrorDocument 404 /404.html

také pomůže

[9] Statický web na CD

los_adios, 12. května 2006, 18:11

Poměrně dlouhou dobu jsem se pokoušel přijít na to, jak vyřešit problém s vytvořením presentačního CD. Pomůže mi toto řešení? Zkoušel jsem šablony v DW, ale to není úplně dobrý řešení - nemožnost do knihoven vkládat neuzavřené tagy například. Díky za odpověď...

[10] Re: Statický web na CD

Pachollini, 12. května 2006, 18:13

Rozhodně se tento způsob použít dá, záleží, jak je ten web, který chceš exportovat udělaný, ale sám jsem takhle jeden na CD překlápěl. (Konkrétně http://www.bicycle-tours.cz/ )

[11] ad BoneFlute

- anonym - , 1. listopadu 2006, 06:42

dik za clanek ty tri dny obdivuji, me to trvalo dele

[12] Tento 3 roky starý článek je stále aktuální

Jakub Hejda, 27. prosince 2007, 09:43 http://www.clickmedia.cz

Díky moc za skvělý článek. I po více než 3 letech je mi užitečný :)

Aktuální Seky

.