Nefunguje mi routování na hostingu na forpsi
- tomas.lang
- Člen | 53
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
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
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
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
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 naindex.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
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
David Grudl napsal(a):
A je to korektní hodnota, skutečně má mít URL tvarhttp://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
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
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
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
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 naindex.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
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
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)
- Honza Kuchař
- Člen | 1662
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)