Dynamické rozlišování HTTPS

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

Ahoj. Potřeboval bych poradit. Mám systém, kde informaci o tom, zda stránka má být dostupná na HTTP nebo na HTTPS, získám z modelu (podle toho, jaký je aktuální typ obsahu na stránce). Jinak se ale adresy nijak neliší, tj. změním-li typ obsahu existující stránky, měla by její URL zůstat stejná, pouze HTTP se změnit na HTTPS a naopak. Ideální by bylo, kdyby obě varianty zpracovával stejný Presenter:action – ale pokud bych musel vyrobit jeden action pro zabezpečenou a jeden pro nezabezpečenou verzi, taky bych to přežil…

Jak byste to řešili?

Vidím zde dvě možnosti

  1. vypnout kanonizaci – to nechci, možná kdyby šlo z kanonizace vyřadit kanonizaci protokolu
  2. napsat si vlastní router – to mi přijde dost komplikované, pokud chci zachovat vymoženosti Route

Díky za rady.

Filip Procházka
Moderator | 4668
+
0
-

Můžeš routy sestavovat podle současného protokolu

$httpRequest = $container->httpRequest;
$flags = $httpRequest->isSecured() ? Route::SECURED : 0;

$router[] = new Route('maska', array(), $flags);
$router[] = new Route('maska2', array(), $flags);
$router[] = new Route('maska3', array(), $flags);

...

Routa se ti nebude kanonizovat a když budeš chtít, můžeš si ji ručně (třeba ve startup() metodě) kanonizovat sám na zabezpečený, nebo nezabezpečený protokol automaticky.

stanley
Člen | 22
+
0
-

To zní dobře, mám jen jeden problém – v navigaci, kde jsou všechny stránky, budou všechny odkazy vždy buď nezabezpečené, nebo zabezpečené, což bych opravdu nerad.

Problém tvorby odkazů bych vyřešil rozlišením dvou action – jedna pro HTTP, jedna pro HTTPS. Jen je pak problém se zpětným matchováním rout – potřeboval bych, aby URL s HTTPS matchla na routu k „securedAction“ a URL s HTTP matchla na routu k „defaultAction“. Tj. abych mohl vyrobit dvě routy se stejnými maskami a router je rozlišoval podle ne/přítomnosti Route::SECURED.

To mi ale implikuje psaní vlastního routeru, ach jo.

Každopádně ale díky za radu!

stanley
Člen | 22
+
0
-

Tak možná by to šlo vyřešit takhle…

class MyRouter extends Application\Routers\Route
{
	protected $model;

	public function __construct($model, $mask, $metadata = array(), $flags = 0) {
		$this->model = $model;
		parent::__construct($mask, $metadata, $flags);
	}

	/**
	 * Constructs absolute URL from Request object.
	 * @param  Request
	 * @param  Nette\Http\Url referential URI
	 * @return string|NULL
	 */
	public function constructUrl(Application\Request $appRequest, Nette\Http\Url $refUrl) {
		$url = parent::constructUrl($appRequest, $refUrl);
		$params = $appRequest->getParameters();
		if (!$this->model->isSecured($params['pageId'])) {
			return $url;
		}
		$url = preg_replace('/^http/', 'https', $url);
		return $url;
	}
}

Spolu s kanonizací by to mohlo fungovat, nebo se pletu?