Odstranění nefunkčního backlink parametru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Bernard Williams
Člen | 207
+
0
-

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 | 796
+
0
-

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
+
0
-

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 | 796
+
0
-

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);
	}
}