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.