Automatické přesměrování URL na kanonickou formu

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

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

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

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

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

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

phx
Člen | 651
+
0
-

Blba otazka: co to je kanonicka URL?

David Grudl
Nette Core | 8228
+
0
-

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/

PetrP
Člen | 587
+
0
-

Další blbá otázka ale kdo určuje kánon, které je to správně, popřípadě kde se dá nastavit.

David Grudl
Nette Core | 8228
+
0
-

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.

mkrause
Člen | 20
+
0
-

Super, mrkneme na to při nejbližší příležitosti :)