Dynamické rozlišování HTTPS
- stanley
- Člen | 22
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
- vypnout kanonizaci – to nechci, možná kdyby šlo z kanonizace vyřadit kanonizaci protokolu
- 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
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
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
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?