Nefunguje mi routování na hostingu na forpsi

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

Zdravím,

mám problém s routováním na stránkách které mám hostované na forpsi – mám je rotouvané čistě jen pomocí <presenter>/<action>/<id> a takto vzniklé URL mi hlásí že soubor index.php v dané složce nebyl nalezen, takže předpokládám že Nette se ani nedostane ke slovu…

Co vše je potřeba aby Nette plně fungovalo? – co musí být podporováno Apachem (či jiným serverem), co musí mít PHP za extensiony, atd.? Děkuji…

Jinak zkoušel jsem i cestu pomocí URL ve tvaru ?presenter=presenter&… ale v tomto pripade se dostal ke slovu jen DefaultPresenter s Default pohledem, a to i kdyz byl v URL pohled nastaven kuprikladu na View…


Pak jsem se ještě chtěl zeptat – lehce jsem si upravil ukázkový projekt modules-usage, do modulu admin jsem dal nějakou administraci položek v databázi a nechal jen odkazy na překlikávání mezi Front a Admin – v sekci Front jsem pak udělal výpis z databáze.

Sekce Front funguje jak má, a odkazy mezi Front a Admin fungují.

Problém je u sekce admin, protože se mi odkaz na Front vytvoří v takovémto tvaru: http://localhost/cesta-k-administraci//cesta-k-frontu, tedy napr. http://localhost/Projects/test/admin//Projects/test

Nastavení u routování mám takovéto:

$router[] = new Route('index.php', array(
	'module' => 'Front',
	'presenter' => 'Default',
), Route::ONE_WAY);
$router[] = new Route('administrace/<presenter>/<action>/<id>', array(
	'module' => 'Admin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));
$router[] = new Route('<presenter>/<action>/<id>', array(
	'module' => 'Front',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));
pmg
Člen | 372
+
0
-

takto vzniklé URL mi hlásí že soubor index.php v dané složce nebyl nalezen

Zdá se mi, že není povolen soubor .htaccess. V tom je důležité pravidlo, které všechny požadavky nesměřující na skutečný soubor pošle na index.php.

# mod_rewrite
RewriteEngine On
#RewriteBase /

# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

Jinak zkoušel jsem i cestu pomocí URL ve tvaru ?presenter=presenter&

O správné chování se postará SimpleRouter. Ten se použije také automaticky, pokud se žádná roupa nenastaví.

$router[] = new SimpleRouter(array(
	'presenter' => 'Front',
	'action' => 'default',
));

Chybně generovaná adresa s tím nejspíš souvisí. První routu v příkladu máš nastavenou jako ONE_WAY, takže se pro generování adresy nemůže použít. Schválně zkus jako jediný použít uvedený SimpleRouter.

Editoval pmg (19. 8. 2008 19:55)

David Grudl
Nette Core | 8218
+
0
-

tomas.lang napsal(a):

Zdravím,

Co vše je potřeba aby Nette plně fungovalo? – co musí být podporováno Apachem (či jiným serverem), co musí mít PHP za extensiony, atd.? Děkuji…

Minimum je PHP 5.1, testováno s PHP 5.2.6, žádné extension nejsou potřeba. Aby fungovaly tzv. cool url, tedy <presenter>/<action>/<id>, je potřeba v Apache povolit a nastavit mod_rewrite, obvykle pomocí .htaccess. Více info zde ;)

Pokud je vše na hostingu zapnuté, stačí obvykle zkopírovat demonstrační .htaccess a v něm případně nastavit korektní hodnotu direktivy RewriteBase.

Jinak zkoušel jsem i cestu pomocí URL ve tvaru ?presenter=presenter&… ale v tomto pripade se dostal ke slovu jen DefaultPresenter s Default pohledem, a to i kdyz byl v URL pohled nastaven kuprikladu na View…

V takovém případě ale nesmí být přidány buď žádné Route do $routes, nebo naopak se musí jako poslední přidat $router[] = new SimpleRouter.

Problém je u sekce admin, protože se mi odkaz na Front vytvoří v takovémto tvaru: http://localhost/cesta-k-administraci//cesta-k-frontu, tedy napr. http://localhost/Projects/test/admin//Projects/test

To vypadá na nějakou komplikaci s baseUrl a basePath. Zkuste mi vypsat v Adminu a Frontu hodnotu Environment::getHttpRequest()->getUri()->scriptPath. Také můžete zkusit do rout dát absolutní cestu $router[] = new Route('/administrace...

tomas.lang
Člen | 53
+
0
-

V takovém případě ale nesmí být přidány buď žádné Route do $routes, nebo naopak se musí jako poslední přidat $router[] = new SimpleRouter.

Děkuji, právě jsem nevěděl jak se SimpleRouter zapisuje, a tak jsem se pokusil pouze v configu nastavit toto: service> Nette\Application\IRouter = Nette\Application\SimpleRouter, a do $routes dát prázdnej Router, ale to jsem si říkal že je kravina…

To vypadá na nějakou komplikaci s baseUrl a basePath. Zkuste mi vypsat v Adminu a Frontu hodnotu Environment::getHttpRequest()->getUri()->scriptPath. Také můžete zkusit do rout dát absolutní cestu $router[] = new Route('/administrace...

Hodnota v obou dvou případech je /Projects/test/document_root/, to s tou absolutní cestou ještě zkusím…

tomas.lang
Člen | 53
+
0
-

pmg napsal(a):

Zdá se mi, že není povolen soubor .htaccess. V tom je důležité pravidlo, které všechny požadavky nesměřující na skutečný soubor pošle na index.php.

No teď jsem to dotestoval, a soubor .htaccess normálně pracuje – tedy každopádně funguje, ještě zjistím jestli i mod_rewrite funguje tak jak má, ale minimálně ve výpisu phpinfo() u Apache byl…

Narazil jsem ale na jiný problém – v souboru .htaccess který je u indexového souboru jsem musel zakomentovat tyto dva řádky:

php_flag magic_quotes_gpc off
php_flag register_globals off

Protože jinak mě server hlásil Internal server error – nemohlo by to být tím?

Editoval tomas.lang (19. 8. 2008 20:41)

David Grudl
Nette Core | 8218
+
0
-

Hodnota v obou dvou případech je /Projects/test/document_root/, to s tou absolutní cestou ještě zkusím…

A je to korektní hodnota, skutečně má mít URL tvar http://example.com/Projects/test/document_root/<presenter>/<action>... ?

tomas.lang
Člen | 53
+
0
-

David Grudl napsal(a):
A je to korektní hodnota, skutečně má mít URL tvar http://example.com/Projects/test/document_root/<presenter>/<action>... ?

Ano, je, protože takto to mám uloženo na localhostu – na ostrém serveru to potom přesouvám…

Hm, a s tou absolutní cestou jsem to moc nepochopil… Cestu s administrace již přeci použitou mám =>

$router[] = new Route('administrace/<presenter>/<action>/<id>', array(
	'module' => 'Admin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

tak nevím jakou jinou jste měl na mysli…

Editoval tomas.lang (19. 8. 2008 20:40)

David Grudl
Nette Core | 8218
+
0
-
php_flag magic_quotes_gpc off
php_flag register_globals off

Můžete jen tak pro srandu králíkům zkusit, jestli chybě Server error zabrání tato úprava?

<IfModule mod_php5.c>
	php_flag magic_quotes_gpc off
	php_flag register_globals off
</IfModule>

…že bych upravil soubory .htaccess v příkladech.

tomas.lang
Člen | 53
+
0
-

David Grudl napsal(a):

Můžete jen tak pro srandu králíkům zkusit, jestli chybě Server error zabrání tato úprava?

Nene, tato oprava boužel nepomohla, a server si i nadále klidně hlásí Internal Server Error…

David Grudl
Nette Core | 8218
+
0
-

Hm, a s tou absolutní cestou jsem to moc nepochopil… Cestu s administrace již přeci použitou mám =>

$router[] = new Route('administrace/<presenter>/<action>/<id>', array(
	'module' => 'Admin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

To je relativní cesta – relativní vůči cestě http://example.com/Projects/test/document_root/, takže výsledná cesta je pak třeba http://example.com/Projects/test/document_root/administrace/mujpresenter. Zkuste do Route zadat absolutní cestu, tedy celou, od (včetně) prvního lomítka za example.com.

tomas.lang
Člen | 53
+
0
-

pmg napsal(a):

Zdá se mi, že není povolen soubor .htaccess. V tom je důležité pravidlo, které všechny požadavky nesměřující na skutečný soubor pošle na index.php.

# mod_rewrite
RewriteEngine On
#RewriteBase /

# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

Vůbec jsem si nevšiml vaše zakomentovaného RewriteBase / – zkusil jsem to, a – ono to funguje! :)

tomas.lang
Člen | 53
+
0
-

David Grudl napsal(a):

Zkuste do Route zadat absolutní cestu, tedy celou, od (včetně) prvního lomítka za example.com.

Takže aktuálně jsou Route nastavil takto:

$router[] = new Route('/Projects/test/document_root/administrace/<presenter>/<action>/<id>', array(
	'module' => 'Admin',
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));

a i nadále je chování naprosto totožné… :-(

Editoval tomas.lang (19. 8. 2008 20:56)

phx
Člen | 651
+
0
-

Co ja vim tak vetsinou php_flag je zakazany takze to je 1. duvod internal error. Pokud to po zakomentovani php_flag zacne hlasit 404 ci 403 tak problem je v ceste. Je nutne spravne nastavit RewriteBase. Toto je zapricineno napr tim, ze virtualhost je vytvaren za pomoci VirtualDocumentRoot

RewriteBase /

UPDATE:

HA pozde…

Editoval phx (19. 8. 2008 21:03)

David Grudl
Nette Core | 8218
+
0
-

Jak ta URL přesně vypadá? Dá se na to někde podívat?

Honza Kuchař
Člen | 1662
+
0
-

Tak u mě se tahle záhadná chyba objevila taky. Pak jsem přišel na to, že ta 403 se vyvolá hned po zapnutí mod_rewrite. → Hledal jsem a našel jsem, že mod_rewrite vyžaduje mít zapnuté FollowSymLinks. Tzn. můj .htaccess vypádá následovně:

Options +FollowSymLinks

# mod_rewrite
RewriteEngine On
#RewriteBase /

# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

A nyní vše funguje perfektně! :)

Editoval honzakuchar (15. 3. 2009 0:39)