Jan 04 2009

Apache mod_rewrite a htaccess na Debianu

Tag: Apache,Debian,LinuxJens @ 23:00

Zprovoznění mod_rewrite pro Apache2 na různých verzích debianu nebylo vždy stejné. Dřívější funkční použití a2enmod vyžadovalo (na prvních verzích Etche) předponu mod_. V současné stable verzi (Etch/6) i v testing (Lenny) se oba přístupy sjednotili a stačí tedy už jen: a2enmod rewrite. Musím připomenou že utilita a2enmod vytváří pouze symbolický link z /etc/apache2/mods-available do /etc/apache2/mods-enabled (takže se bez ní dá jednoduše obejít s využítím ln -s ...).

Celý postup pak tedy vypadá následovně (vše je třeba dělat pod rootem nebo použít sudo).

  1. Povolení modulu
  2. # a2enmod rewrite
    
  3. Nastavení konfigurace Apache pro daný adresář a (virtuální doménu):
    <Directory /var/www/projekt>
    	Options FollowSymLinks
    	AllowOverride All
    </Directory>
    
  4. A konečně, v souboru /var/www/projekt/.htaccess musí být hned na začátku:
    RewriteEngine on

Pokud by jste chtěli být úplně “precizní”, tak se doporučuje ještě v souboru .htaccess zapsat konfiguraci pro přepisovaní pomocí mod_rewrite do podmíněného bloku kde se testuje, zda-li je mod_rewrite natažen. Tedy například takto:

<IfModule mod_rewrite.c>
	RewriteEngine On
	...
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule . /index.php [L]
	...
</IfModule>

Vyzkoušeno na: Lenny: Apache/2.2.9 a Etch: Apache/2.2.3.


Dec 11 2008

Zend Framework: Hostname routing

Tag: SEO,Zend FrameworkJens @ 23:11

O routování subdomén v Zend Framework (ZF) jsem už v jednom článku psal. Kolega mě upozornil, že v současném ZF 1.7.0 již takové routování je v podobě třídy Zend_Controller_Router_Route_Hostname. V době psaní předchozího článku byla k dispozici pouze verze ZF 1.5.0, která routování domén a subdomén nepodporovala. Prošel jsem proto dokumentaci ZF abych zjistil, od kdy je tato nová vlastnost podporována.

První zmínka je ve verzi ZF 1.5.3 (2008-07-28) -viz zend.controller.router.html, kapitola Hostname routing staticky:

$route = new Zend_Controller_Router_Route(
    array(
        'host' => 'blog.mysite.com',
        'path' => 'archive'
    ),
    array(
        'module'     => 'blog',
        'controller' => 'archive',
        'action'     => 'index'
    )
);
$router->addRoute('archive', $route);

a dynamicky:

$route = new Zend_Controller_Router_Route(
    array(
        'host' => array(
            'regex'   => '([a-z]+).mysite.com',
            'reverse' => '%s.mysite.com'
            'params'  => array(
                1 => 'username'
            )
        ),
        'path' => ''
    ),
    array(
        'module'     => 'users',
        'controller' => 'profile',
        'action'     => 'index'
    )
);
$router->addRoute('profile', $route);

V této verzi se tedy používal standardní Zend_Controller_Router_Route rozšířený o možnosti routovaní domén a subdomén.

Zend_Controller_Router_Route_Hostname

Překvapující je, že kapitola o routování domén a subdomén mizí od dokumentace ZF 1.6.2 do verze ZF 1.7.0 Preview. Že by chybka? Nebo záměr? Další zmínka se objevuje až v současné verzi online dokumentace, kdy je aktuálně k dispozici Zend Framework 1.7.1. V současné verzi to vypadá tak, že princip routování domén a subdomén doznal zásadních změn a proto byl rozdělen a vznikla vlastní třída pro Zend_Controller_Router: Zend_Controller_Router_Route_Hostname.

Použití je poměrně jednoduché, a můžete routovat všechno včetně třeba TLD:

$routa = new Zend_Controller_Router_Route_Hostname(
	':subdomena.domena.cz',
	array(
		'controller' => 'index',
		'action'     => 'index'
	)
);
$router->addRoute('hostname', $routa);

Takto nadefinovaná routa začne fungovat na všechny URL s definovanou subdoménou, tedy např.: http://www.domena.cz ale nebude fungovat na http://domena.cz – neobsahuje subdoménu.

Zajímavější je však již zmíněná možnost routovat doménu druhého i prvního řádu (TLD):

$routa = new Zend_Controller_Router_Route_Hostname(
	':subdomena.:domena.:tld',
	array(
		'controller' => 'index',
		'action'     => 'index'
	)
);
$router->addRoute('hostname', $routa);

což funguje úžasně, přesně podle očekávání, takže na URL http://www.domena.cz (v IndexController.php a action indexAction vypíšeme $this->getRequest()->getParams()):

array (
  'subdomena' => 'www',
  'domena' => 'domena',
  'tld' => 'cz',
  'controller' => 'index',
  'action' => 'index',
)

V dokumentaci Zendu ještě navíc doporučují použít zřetězení této routy s nějakou předchozí definovanou “path” routou proto, aby se tyto parametry nepřenášely pro každé domény či subdomény ale pouze pro určité URL.

A na závěr klasicky, oficiální odkaz on-line dokumentaci zendu.


Nov 19 2008

Povinné parametry funkcí v PHP

Tag: PHPJens @ 00:20

Vždycky jsem si myslel, že pokud není u funkce v PHP definován parametr jeho defaultní hodnotou — function Foo($a = ''){} — bere se, že je parametr povinný. Moje chyba, PHP mě opět vypeklo a přitom v tak elementární věci.

Mějme příklad:

<?php
function Bar($stuf)
{
	echo $stuf;
}
Bar();

výsledek:

Warning: Missing argument 1 for Bar(), called in /var/www/error.php on line 6 and defined in /var/www/error.php on line 2
Notice: Undefined variable: stuf in /var/www/error.php on line 4

Výstup mě nemile překvapil, nejen že volání funkce nepadne na Fatal Error ale navíc se tělo funkce provede s nedefinovanou hodnotou proměnné $stuf. Asi bude třeba na každý parametr volat isset(...). Jak geniální. Zdá se že povinné parametry v PHP neexistují.

Myslím že krása PHP spočívá právě v jeho nevyzpytatelnosti ;) Takže zkusme ještě podobný příklad, s určením typu “nepovinného” parametru:

<?php
function Bar(array $stuf)
{
	echo $stuf;
}
Bar();

Výsledek je pak zcela logicky a jasně odvoditelný (!?!):

Catchable fatal error: Argument 1 passed to Bar() must be an array, none given, called in /var/www/error.php on line 6 and defined in /var/www/error.php on line 2

A proto v PHP rád programuji … spousty let a stále se učím základům :))
Vyzkoušeno na PHP 5.2.6.


Nov 17 2008

Vyšel Zend Framework 1.7.0

Tag: Zend Framework,ZprávičkyJens @ 23:30

Dnes, tedy 17.11.2008 vyšel nový “stabilní” Zend Framework.

V oficiální zprávičce si můžete přečíst všechna nová rozšíření a vylepšení, zdá se že je toho docela dost a proto bych doporučoval s upgradem ještě chvíli počkat, než si to sedne a vychytají se mouchy :)

Co mě zaujalo z výčtu novinek/změn nejvíce:

  • Výkonnostní vylepšení v Zend_Loader, Zend_Controller
  • Zend_Config_Writer
  • File transfer enhancements

Více viz již zmíněné oznámení o vydání ZF 1.7.0.


Nov 11 2008

Přesměrování STDERR na STDOUT

Tag: LinuxJens @ 23:00

V linuxu je třeba mnohdy přesměrovat chybový výstup stderr na standardní výstup stdout – a to celé pak ideálně poslat do /dev/null :) Toto se může hodit například při spouštění různých cronů. Pokud by totiž skript generoval nějaký výstup (stderr nebo stdout), cron daemon ho pošle uživateli jako “varovný email”, že něco nemusí být v pořádku.

$ skript.sh 2>&1 >/dev/null

Tento zápis tedy zajistí, že stderr(2) se přesměruje na stdout(1) a to se přesměruje na /dev/null.

Více viz


Nov 01 2008

Screenshot stránky z příkazové řádky v Linuxu

Tag: Linux,WebJens @ 23:00

Jak vytvořit screenshot nebo náhled nějaké webové stránky? Navíc na serveru, v Linuxu a z příkazové řádky? Určitě existuje mnoho způsobů – ať už použití externí on-line aplikace, speciálního programu či utility nebo převod HTML do obrázku …

Já zde popíšu metodu, která využívá vámi preferovaný prohlížeč instalovaný na serveru (ja vybral Firefox — na Debianu iceweasel) a v kombinaci s VNC serverem jednoduše típnu obrazovku pomocí utility import.

Pokračování článku…


Oct 30 2008

Náhledy webových stránek – Browsershots.org

Tag: WebJens @ 23:00

Pomocí on-line aplikace Browsershots.org si můžete vygenerovat nejen náhled webových stránek, ale především prověřit vaše webové stránky – hlavně layout a design – ve více jako 80-ti prohlížečích na různých operačních systémech! Mimo testované prohlížeče a operační systémy si navíc můžete vybrat parametry jako velikost obrazovky, barevnou hloubku, podporu JavaScriptu, Javy, nebo verzi Flashe.

Celé je to zadarmo a dokonce je k dispozici i dokumentace API a zdrojáky pro stažení, pomocí kterých si můžete vytvořit vlastní farmu serverů, které vám budou takovou aplikaci sprostředkovávat.


Oct 29 2008

svnadmin – zálohování SVN repositáře

Tag: Linux,SubversionJens @ 16:00

Možnost jak zálohovat SVN repositář je určitě více. Sám jsem používal klasický, nízkoúrovňový tar + gzip na adresář repositáře. Tato varianta je celkem dostačující ale nerespektuje aktuální SVN transakce a zámky – proto není vhodné spouštět zálohu v momentě kdy není zajištěno že někdo něco nekomituje. Navíc, pokud si repositář poškodíte, budou se zálohovat poškozené soubory.

Zřejmě lepším způsobem bude použití utility svnadmin, která pracuje s repositářem na vyšší úrovni a do výsledného souboru vytváří zálohy jednotlivých revizí postupně s ohledem na aktuální stav repositáře.

# svnadmin dump /path/to/repository > repository-dump.db

Výsledkem je převážně textový soubor repository-dump.db, v němž jsou popsány jednotlivé revize a změny v nich. Tento lze většinou ještě s úspěchem komprimovat a tím dosáhnout maximální úspory místa zálohy.

Obnovení je stejně jednoduché jako záloha. Obnovu je třeba provést do již vytvořeného prázdného repozitáře (svnadmin create) – více viz Instalace SVN za 10 minut.

# svnadmin load /path/to/repository < repository-dump.db

Více o svnadmin se dozvíte v ‘SVN Book’, kapitola ‘Repository Maintenance’.


Jul 25 2008

tar: základy linuxové komprese s gzip

Tag: LinuxJens @ 00:00

Nebudu zde popisovat všechny možné i nemožné varianty tohoto příkazu, ale zmíním se pouze o nejpouživatelnějších (dvou:).

Vytvoření tgz/tar.gz archívu:

# tar cfz <tgz-cil> <zdroj1> <zdroj2> ...

c – create, f – file, z – gzip

Příklady:

# tar cfz archiv.tar.gz *
# tar cfz /backup/etc.tgz /etc
# tar cfz source.tgz *.html *.php *.phtml *.css

Užitečný parametr, který vynechává vámi zvolené soubory s maskou je exclude:

# tar cfz old-logs.tgz /var/log --exclude=*.log

Extrahování tgz/tar.gz archívu:

# tar xfz <tgz-zdroj> [<cil>]

x – extract

Pro další parametry taru vás odkážu typicky linuxářsky: rtm — man tar.


Jul 22 2008

Debian: Instalace SVN (Subversion) za 10 minut

Tag: Apache,Debian,Linux,SubversionJens @ 19:55

Subversion je v současné době asi nejlepší nástroj na správu revizí různých zdrojových kódů různých aplikací ale i binárních dat. Navíc mě velmi překvapil svojí vynikající vlastností: vytváří každou další revizi pouze na základě deltifikace a komprese. Výsledná (fyzická) velikost repositáře je malá i v případě správy mnoha revizí. Možná i právě proto používají Seznamáci na zálohování map právě SVN (SVN backup).

Pokračování článku…


« Previous PageNext Page »