Nette, mod_rewrite, posunutí adresářů

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

Zdravím všechny, řeším následující problém. Mám standardní adresářovou strukturu Nette Skeletonu, ale jelikož nemůžu jít do nadřazené složky, přistupuju rovnou k document_root přes následující mod_rewrite pravidla:

RewriteEngine On
RewriteRule ^.*$ document_root/$0 [L]

což přesměruje výstup do document_root…jenže v document_root je standardní Nette mod_rewrite rules a prostě to celé dohromady nefunguje, hází to chybu, že nemůže najít Presenter, kterej by to vůbec hledat nemělo…příklad: http://localhost/…kty/Skeleton hlásí 404 s tím, že nemůže najít ProjektyPresenter. Složka projekty/Skeleton obsahuje výše zmíněný pravidla v htaccessu a pak standardní distribuci Nette (app/document_root/libs). Můj typ je, že tim přesměrováním matu Nette překladač adres, ale nevím, jak mu pomoct, nebo co dělám špatně. Předem díky za tipy. :-)

J.

Majkl578
Moderator | 1364
+
0
-

Nejjednodušší bude přesunout obsah document_rootu na úroveň app a libs. Samozřejmě musíš upravit cesty v index.php

potapnik
Člen | 127
+
0
-

Tomu jsem se chtěl právě vyhnout…ztrácím tím trochu té elegance, na které jsem životně závislý ;)

Spíš mě zajímá, proč tomu tak je. Kde bere Nette jistotu, že hledá na základě URL správný Presenter?

arron
Člen | 464
+
0
-

Nette hleda presentery na zaklade definice rout. A v tom bych videl problem. Zkusil bych pred kazdou masku routy pridat jeste ten document_root.

$router[] = new Route('document_root/index.php', array(
	'presenter' => 'Homepage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new Route('document_root/<presenter>/<action>/<id>', array(
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => NULL,
));
potapnik
Člen | 127
+
0
-

Abych ještě trochu objasnil ten problém: mám následující adresářovou strukturu:
c:\htdocs (to je root localhostu)
c:\htdocs\projects\Skeleton
c:\htdocs\projects\Skeleton\app
c:\htdocs\projects\Skeleton\libs
c:\htdocs\projects\Skeleton\document_root

Když dám do prohlížeče localhost/projects/Skeleton/document_root, tak všechno funguje jak má. Ale já bych „moc rád“ :-) zadal do prohlížeče jenom localhost/projects/Skeleton samozřejmě s nadefinovaným htaccesem, aby veškerou komunikaci interně přesměroval na localhost/projects/Skeleton/document_root. Ale zatím nic úspěšně nefunguje. Když dám do routy $router[] = new Route(‚projects/Skeleton/<presenter>/<action>/<id>‘…tak to funguje, ale zase nefungujou relativní cesty přes {basePath}…tak už vážně nevím, co a jak :-)

Patrik Votoček
Člen | 2221
+
0
-

místo aby jsi to přidával do rout nastav si to jako RewriteBase v .htaccess souboru.

Ondřej Mirtes
Člen | 1536
+
0
-

Nastav si jinak VirtualHost v Apachi a nemusíš laborovat nad těmito problémy. Anebo si uprav adresářovou strukturu, aby app a libs byly uvnitř document rootu. Je to jen detail, když si dáš pozor na skrytí obsahu app a libs pomocí Deny from all.

mm-marek
Člen | 61
+
0
-

Nebo na lokálu nastavit přes apache, na hostingu v htaccess viz
http://diskuse.jakpsatweb.cz/?…

nanuqcz
Člen | 822
+
0
-

Jde nějak těsně před voláním $application->run(); v bootstrapu upravit už vytvořené routy? Pak by totiž byl tenhle problém vyřešený a routy by se daly automaticky přes nějaký skript opravit. Stejně jako Potapnik se mi nelíbí, že musím vytahovat soubory z public (v Nette 2 adresář www) ven. Prostě patří do www a chci je tam nechat :-) Bohužel metoda setMask() ve třídě Route je nastavená jako private, takže to nejde :-( Nějaké nápady?