Nette Framework: kanonizace utm parametrů


POZOR: IE9 a Safari 5+ zahazují fragment při opakovaném redirectu. Takže bohužel tato technika není 100% spolehlivá.


Na diskuse.jakpsatweb.cz se objevil zajímavý dotaz - jak přesměrovat request s utm_ parametry na request bez nich a zároveň je přesunout do fragmentu

Důvod je jednoduchý, pokud vám budou na web směřovat odkazy s utm_ parametry i bez nich, vyhledávače by si mohly myslet, že máte na webu duplicitní obsah, protože je přístupný přes více různých adres. Takový vyhledávač by se mohl nezaujatému pozorovateli jevit velice stupidní, protože “každý přece ví”, že utm_ parametry jsou jen na analýzu návštěvnosti. Ale jistota je jistota.

Prý to jde udělat jednoduchým regulárem v .htaccess, ale co my, co z mod_rewrite máme opruzeniny? My si napíšeme helper

class HttpHelpers extends Nette\Object
{
    public static function utmCanonicalize(Nette\Http\Request $httpRequest, Nette\Http\Response $httpResponse)
    {
        if ($httpRequest->isAjax() || (!$httpRequest->isMethod('GET') && !$httpRequest->isMethod('HEAD'))) {
            return;
        }

        $utm = array();
        foreach ($params = $httpRequest->getQuery() as $name => $value) {
            if (substr($name, 0, 4) === 'utm_') {
                unset($params[$name]);
                $utm[$name] = $value;
            }
        }

        if ($utm) {
            $url = clone $httpRequest->getUrl();
            $url->setQuery($params);
            $url->setFragment(http_build_query($utm));
            $httpResponse->redirect($url, Nette\Http\IResponse::S301_MOVED_PERMANENTLY);
            exit(0);
        }
    }
}

Asi úplně nejčistější místo pro takový kód v aplikaci by bylo BasePresenter::canonicalize(), ale to už máme za sebou injectování závislostí i akci - zbytečná režie kvůli takové “hlouposti”. Chtělo by to trochu dříve. Přidáme ho tedy do app/bootstrap.php

// ...
$container = $configurator->createContainer();
HttpHelpers::utmCanonicalize($container->httpRequest, $container->httpResponse);
// ...

Nyní si zkuste otevřít tuto adresu

/blog/nette-framework-kanonizace-utm-parametru?utm_source=self&utm_medium=experiment”:/blog/nette-framework-kanonizace-utm-parametru?utm_source=self&utm_medium=experiment

A uvidíte kód v akci :)

Mám tu chybu? Fix me

Autor:

comments powered by Disqus