Aug 25 2009

Jak vypnout personalizované vyhledávání v Googlu

Tag: SEO,WebJens @ 21:20

Personalizované vyhledávání v Googlu je mnohdy dosti problematické a vrací „až moc personalizovaně chytré“ výsledky, které buď nejsou relevantní a nebo v tu chvíli nežádoucí. Nejjednoduším způsobem jak toto personalizované vyhledávaní vypnout je připad URL parametr pws=0, tedy ideálně na konec přidat vašeho URL dotazu přidat &pws=0. Jistě, existuje i klikací řešení vypnutí, ale než to člověk najde a nastaví, tak přidání parametru do URL je mnohem rychlejší, navíc nezáleží na tom zda je člověk přihlášen či nikoliv. Více o parametru pws přímo na blogu Googlu.

Jinak další zajímavostí, která nepřímo souvisí s předchozím tématem je i nový vyhledávací engine Caffeine (najdete ho na adrese http://www2.sandbox.google.com/), který Google nedávno pustil do testovacího provozu, rozhodně stojí zato vyzkoušet pozice a relevance vašich oblíbených frází a zkusit porovnat s aktuálními výsledky. Více se dozvíte v oznámení Help test some next-generation infrastructure přímo na blogu Googlu.


Jan 08 2009

GoogleBot a HTTP status 503

Tag: PHP,SEO,Zend FrameworkJens @ 23:55

Občas je třeba provést na stránkách údržbu tak, že je třeba na chvíli zastavit zobrazování webu – ať už je to údržba databáze nebo cokoliv jiného. V takovém případě se změní například index.php aby zobrazoval „nějakou hlášku o údržbě“. Problém ale může nastat, když zrovna v tu chvíli indexuje váš obsah třeba GoogleBot. Vaše hláška o údržbě pro něj bude obyčejná informace vrácená typicky s hlavičkou HTTP statusu 200 (viz. RFC HTTP status 200) a GoogleBot stránku pěkně zaindexuje a pak se nestačíte divit co že to google vrací za výsledky na vašem webu :)

Na toto existuje doporučení přímo od Googlu: „… nastavte server tak, aby vrátil status 503 (viz. RFC HTTP status 503) namísto statusu 200 …“. V PHP jednoduchá věc pomocí funkce header(), ideálně ještě doplníme vlastní hlášku o údržbě:

<?php
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
?>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503 Service Temporarily Unavailable</title>
</head><body><h1>Service Temporarily Unavailable</h1>
<p>The server is temporarily unable to service your request due to maintenance downtime or
capacity problems. Please try again later.</p>
</body></html>

Retry-After hlavička

Navíc, podle RFC – Header Field Definitions je může být použito v hlavičce u statusu 503 pole Retry-After:

The Retry-After response-header field can be used with a 503 (Service Unavailable) response to indicate how long the service is expected to be unavailable to the requesting client. This field MAY also be used with any 3xx (Redirection) response to indicate the minimum time the user-agent is asked wait before issuing the redirected request. The value of this field can be either an HTTP-date or an integer number of seconds (in decimal) after the time of the response.
Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds ) Two examples of its use are Retry-After: Fri, 31 Dec 1999 23:59:59 GMT Retry-After: 120 In the latter example, the delay is 2 minutes.

Tedy, navíc ještě přidáte hlavičku Retry-After s hodnotou (v sekundách, nebo přímo časem), za kterou předpokládáte že web pojede – na příklad za 1 hodinu (3600s):

header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 3600');

Zend Framework

A závěrem ještě příklad, pro odeslání statusu 503 v Zend Frameworku:

$this->getResponse()->clearBody();
$this->getResponse()->setRawHeader('HTTP/1.1 503 Service Temporarily Unavailable');
$this->getResponse()->setRawHeader('Status: 503 Service Temporarily Unavailable');
$this->getResponse()->setRawHeader('Retry-After: 3600');

$msg = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">';
$msg.= '<html><head><title>503 Service Temporarily Unavailable</title>';
$msg.= '</head><body><h1>Service Temporarily Unavailable</h1>';
$msg.= '<p>The server is temporarily unable to service your request due to maintenance downtime or
capacity problems. Please try again later.</p>';
$msg.= '</body></html>';			

$this->getResponse()->setBody($msg);
$this->getResponse()->sendResponse();

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.


Apr 16 2008

Apache 2: %2F a %5C v URL – „404 Not Found“

Tag: Apache,SEOJens @ 09:05

Výchozí nastavení direktivy AllowEncodedSlashes je v Apache 2 nastaveno dle oficiální dokumentace na Off. To způsobí, že v případě že se v URL objeví %2F, tedy „enkódovaný“ znak / (případně %5C pro ) Apache hodí výchozí chybovou hlášku 404 Not Found přičemž tato chyba nezohlední ani vlastní stránky 404 a vždy se zobrazuje výchozí hláška Apache.

Pokračování článku…


Mar 31 2008

Zend Framework: Routování subdomén

Tag: PHP,SEO,Zend FrameworkJens @ 00:00

Routování v Zend Frameworku (ZF) není nic zvláště složitého. Stačí pouze lehce nahlédnout do dokumentance a začít používat defaultní routovaní případně si nastavit nějaká jiná vlastní pravidla.

Problém ale nastává v případě, že chcete do routování zahrnout subdomény. Na to ZF není přímo (zatím? — v době psaní tohoto článku je stable verze 1.5) vybaven a je tedy třeba použít kousek „vlastního kódu“.

Pokračování článku…


Feb 26 2008

Debian, Apache2 + ssl + mod_rewrite

Tag: Apache,Debian,Linux,SEOJens @ 23:59

Výchozí instalace web serveru Apache2 na Debianu (Etch, Lenny) neobsahuje podporu SSL — tedy protokolu HTTPS. Zároveň neobsahuje ani zavedený modul mod_rewrite toliko potřebný pro krásná URL a SEO optimalizaci. Vše lze napravit několika málo příkazy.

Pokračování článku…