Odstranění nefunkčního backlink parametru
- Bernard Williams
- Člen | 207
Nazdárek,
brouzdám si tak v logu a ve statistikách webu a docela koukám, kolik URL obsahuje parametr „backlink“ a tak mě napadlo, že by nemuselo být špatné neplatné parametry backlink odstraňovat:
if (isset($this->params['backlink'])) {
$session = $this->context->session->getSection('Nette.Application/requests');
if (!isset($session[$this->params['backlink']])) {
$query = $this->presenter->getHttpRequest()->getQuery();
$query['backlink'] = NULL;
$this->redirect('this', $query);
}
}
Podle všeho to funguje dobře. Kdyby měl někdo nějaké nápady na vylepšení (čistější řešení), tak ho jen uvítám.
Snad to někomu pomůže.
Bernard
- uestla
- Backer | 799
Ahoj, také jsem to řešil, akorát u sebe vyžívám toho, že
$backlink
je persistentní součást presenteru a při neexistenci
přesměrovávám natvrdo 301:
if ($this->backlink) {
$session = $this->context->session->getSection('Nette.Application/requests');
if (!isset($session[$this->backlink]) || !$session[$this->backlink]) {
$this->backlink = NULL;
$this->redirect(Nette\Http\IResponse::S301_MOVED_PERMANENTLY, 'this');
}
}
- Bernard Williams
- Člen | 207
S tou 301 máš pravdu – na to jsem zapomněl.
Ale tvůj kód nezachovává ostatní parametry předané metodou GET (např. v e-schopech by mohlo být něco jako: „?orderby=nazev“), což asi tak není ideální.
Taky se mi tvůj kód nějak divně chodí s tím $this->backlink. Osobně ho v mé aplikaci taky využívám, ale schválně jsem v tomto kódu sáhl po konstrukci $this->params[‚backlink‘], aby se to přímo bralo z URL.
Nakonec jsem celý kód rozšířil o odstranění neplatného flash parametru:
if (isset($this->params['backlink']) OR isset($this->params[self::FLASH_KEY])) {
$session = $this->context->session->getSection('Nette.Application/requests');
$query = $this->presenter->getHttpRequest()->getQuery();
$redir = false;
// odstranim neplatny backlink
if (isset($this->params['backlink']) AND !isset($session[$this->params['backlink']])) {
$query['backlink'] = NULL;
$redir = true;
}
// odstranim neplatne flash zpravy
if (!$this->hasFlashSession() && !empty($this->params[self::FLASH_KEY])) {
$query[self::FLASH_KEY] = NULL;
$redir = true;
}
if ($redir)
$this->redirect(IHttpResponse::S301_MOVED_PERMANENTLY, 'this', $query);
}
- uestla
- Backer | 799
Díky tobě jsem objevil i další věci… Když ručně změním hodnotu persistentního parametru, jako by framework automaticky provedl přesměrování na novou URL – čili v onom kódu by nemuselo být nutné přesměrování provádět…
Jinak pro query parametry není třeba šahat až k httpRequestu, ale
prostě předat v $this->params
, kde jsou GET parametry rovněž
promítnutné.
V principu používám totéž – ve startup()
volám svojí
metodu removeExpiredParams()
:
protected function removeExpiredParams()
{
// backlink
if ($this->backlink) {
$session = $this->context->session->getSection('Nette.Application/requests');
if (!isset($session[$this->backlink]) || !$session[$this->backlink]) {
$this->backlink = NULL;
}
}
// flash message ID
if (isset($this->params[self::FLASH_KEY]) && !$this->hasFlashSession() && !$this->context->httpRequest->isPost()) {
unset($this->params[self::FLASH_KEY]);
$this->redirect(Nette\Http\IResponse::S301_MOVED_PERMANENTLY, 'this', $this->params);
}
}