Automatické přesměrování URL na kanonickou formu
- mkrause
- Člen | 20
Ahoj Davide, chtěl jsem se zeptat, jaký je plán s automatickým
přesměrováním URL na kanonickou formu dle rout? V Presenteru
je
metoda canonicalize()
, kterou k tomu lze použít, a
zakomentovaná vlastnost $autoCanonicalize
. Zajímalo by mě,
jestli se do budoucna počítá spíš s tím, že to Nette bude dělat
automaticky, a nebo jestli máme spíš očekávat, že ta vlastnost zmizí a
bude to na uživateli? :)
- David Grudl
- Nette Core | 8228
Jo, tohle vidím jako jednu ze silných vlastností frameworku. Jen při ladění to trošku překáží, takže jsem $autoCanonicalize odstavil.
Pokud nenajdu nic lepšího, přidám metodu
Environment::isProduction()
a podle ní se bude
canonicalize()
(a také lastModified()
) řídit.
- mkrause
- Člen | 20
Teď nevím, jestli máš na mysli ladění Nette nebo ladění aplikací na něm běžících? Při vývoji máme běžně zapnutý debug (kdy Nette do stránek vypisuje výjimky a podobně), ale zároveň bychom určitě chtěli současně mít v provozu i kanonikalizaci (fuj, to je slovo :) URL, protože potřebujeme mít chování co nejvíce podobné ostrému serveru.
- mkrause
- Člen | 20
Jinak kolega se ještě trochu hrabal v metodě canonicalize(), do které přidal podporu zachování GETových parametrů. Přiznám se, že sám jsem to moc nezkoumal, ale patch přikládám:
diff -r 3715cf356e50 libs/Nette/Application/Presenter.php
--- a/libs/Nette/Application/Presenter.php Wed Jun 18 13:39:24 2008 +0200
+++ b/libs/Nette/Application/Presenter.php Thu Jun 19 14:28:39 2008 +0200
@@ -642,8 +642,14 @@ abstract class Presenter extends Control
$httpRequest = Environment::getHttpRequest();
if ($httpRequest->getMethod() === 'POST') return;
- // TODO: what about signal args
- $uri = $this->createSubRequest($this->getSignalReceiver(TRUE), $this->getSignal(), array());
+ //create new request with all GET parameters
+ $request = new PresenterRequest(
+ $this->request->getPresenterName(),
+ PresenterRequest::FORWARD,
+ (array)$this->request->getParams()
+ );
+
+ $uri=Environment::getApplication()->constructUrl($request);
if (!$httpRequest->getUri()->isEqual($uri)) {
$this->redirectUri($uri, 301);
- David Grudl
- Nette Core | 8228
Automatické přesměrování URL na kanonickou formu je nyní úkolem
třídy Application a je ve výchozím nastavení zapnuté. Lze je vypnout
přes $application->canonicalize = FALSE
- David Grudl
- Nette Core | 8228
Pokud k cíli vede několik možných URL, tak jedno z nich je kanonické a
ostatní se na ně přesměrují. Např.
http://example.com/path/index.php
,
http://example.com/path
→ http://example.com/path/
- David Grudl
- Nette Core | 8228
Kanonické URL je to, které ti vygeneruje router.
Funguje to tak, že router (který je obousměrný) převede HTTP požadavek
na objekt Nette\Application\PresenterRequest. Aplikace poté z tohoto objektu
zpětně vygeneruje URL a pokud není ekvivalentní se aktuálním, dojde
k přesměrování (příklad:
https://nette.org/examples/modules-usage/index.php
nebo
https://nette.org/examples/modules-usage
).
K přesměrování nedojde při AJAXovém nebo POST požadavku.