Modul jmenující se stejně jako název složky vypisuje 404
- doublemcz
- Člen | 15
Založil jsem dva moduly přes routy (Frontend a Backend). Nette applikace je
v relativní složce někde hluboko pod document rootem. Problém je, že
jakmile zadám domena.localhost/adresar-az-k-nette/admin/
tak prohlizec pise, ze slozka admin neni pristupna- tipuju, ze jsou spatna
pravidla v htaccess. Konfigurace nize funguje na virtualnim hostu v korenu
domenu OK v relativni nikoliv. Vite nekdo jak upravit ty pravidla abych mohl
pouzivat slozku admin/css, admin/js atd a url byla stejna i v relativnich
cestach?
$routeList = new RouteList();
// Backend
$routeList[] = new Route(
'/admin/<presenter>/<action>[/<id>]',
array(
'presenter' => 'Index',
'action' => 'default',
'module' => 'Backend',
)
);
// Frontend index.php
$routeList[] = new Route(
'index.php',
array(
'presenter' => 'Index',
'action' => 'default',
'module' => 'Frontend',
),
Route::ONE_WAY
);
// Frontend
$routeList[] = new Route(
'<presenter>/<action>[/<id>]',
array(
'presenter' => 'Index',
'action' => 'default',
'module' => 'Frontend'
)
);
return $routeList;
Výpis htaccess
# disable directory listing
Options -Indexes
# enable cool URL
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteBase /
# prevents files starting with dot to be viewed by browser
RewriteRule /\.|^\. – [F]
# 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]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^admin /index.php [L]
</IfModule>
- castamir
- Člen | 629
definice rout pro moduly se zapisuje trošku jinak. Doporučuju si projít příklad examples/modules-usage, který si stáhneš spolu s nette.
Definice rout by měla vypadat nějak následovně:
$routeList[] = new Route('index.php', 'Frontend:Default:default', Route::ONE_WAY);
$routeList[] = $adminRouter = new RouteList('Backend');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Index:default');
$routeList[] = $frontRouter = new RouteList('Frontend');
$frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Index:default');
Zároveň se se vyhledávají presentery a šablony „top-level“ modulů (v tomto případě Fontend a Backend) defaultně hledají ve složce app/FontendModule resp app/BackendModule. Aby nedocházelo ke konfliktům v názvech presenterů, všechny presentery uvnitř těchto složek by měly mít namespace FontendModule resp BackendModule.
Nastuduj si ten příklad. Je tam i ukázka zanoření dalších submodulů a ukázka, jak se správně používají odkazy mezi moduly, což se ti bude hodit.
Jo a ještě jedna věc. Nastavení rout nevyžaduje žádné úpravy .htaccess. Stačí ten původní např. ze sandboxu (pokud teda nevyžaduješ nějaké jiné speciální nastavení)
Ještě zkus zkontrolovat, zda ti funguje, když zadáš adresu k souboru index.php
Editoval castamir (16. 1. 2013 10:47)
- doublemcz
- Člen | 15
castamir napsal(a):
definice rout pro moduly se zapisuje trošku jinak. Doporučuju si projít příklad examples/modules-usage, který si stáhneš spolu s nette.
Definice rout by měla vypadat nějak následovně:
$routeList[] = new Route('index.php', 'Frontend:Default:default', Route::ONE_WAY); $routeList[] = $adminRouter = new RouteList('Backend'); $adminRouter[] = new Route('admin/<presenter>/<action>', 'Index:default'); $routeList[] = $frontRouter = new RouteList('Frontend'); $frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Index:default');
Zároveň se se vyhledávají presentery a šablony „top-level“ modulů (v tomto případě Fontend a Backend) defaultně hledají ve složce app/FontendModule resp app/BackendModule. Aby nedocházelo ke konfliktům v názvech presenterů, všechny presentery uvnitř těchto složek by měly mít namespace FontendModule resp BackendModule.
Nastuduj si ten příklad. Je tam i ukázka zanoření dalších submodulů a ukázka, jak se správně používají odkazy mezi moduly, což se ti bude hodit.
Jo a ještě jedna věc. Nastavení rout nevyžaduje žádné úpravy .htaccess. Stačí ten původní např. ze sandboxu (pokud teda nevyžaduješ nějaké jiné speciální nastavení)
Ještě zkus zkontrolovat, zda ti funguje, když zadáš adresu k souboru index.php
V routování ale problém není, navíc nejnovější sandboxová aplikace používá router přes factory a ta nemůže vracet pole routů nebo routerlistů, takže jsem to musel udělat přes jeden routerlist.
Nicméně problém je skutečně v .htaccesssu, kde neprochazeji pravdila. Bohuzel zde mam ten problem, ze nevim jak ho upravit tak aby kdyz se nazev slozky potka s nazvem v url – toto hazi 404 (nedostane se vubec do aplikace)
- castamir
- Člen | 629
V routování ale problém není, navíc nejnovější sandboxová aplikace používá router přes factory a ta nemůže vracet pole routů nebo routerlistů, takže jsem to musel udělat přes jeden routerlist.
Právě tomu jsem ten kód přizpůsobil
Nicméně problém je skutečně v .htaccesssu, kde neprochazeji pravdila. Bohuzel zde mam ten problem, ze nevim jak ho upravit tak aby kdyz se nazev slozky potka s nazvem v url – toto hazi 404 (nedostane se vubec do aplikace)
Nenapadá mě, jak to upravit, ale jen jak to obejít. Přejmenovat buď cestu v routě (admin/) na něco jiného nebo přejmenovat složku. Nebo změnit uspořádání souborů a složek a dát k sobě blíž backend a frontend css/js, ale to by moc šikovné nebylo.
- Tomáš Kolinger
- Člen | 136
@doublemcz
.htaccess říká, že pokud na požadované cestě existuje soubor či složka,
tak upřednostní právě soubor/složku před přesměrováním na PHP
aplikaci. Takže nelze mít server.tdl/admin v routě a zároveň používat
složku /admin/. Pro uložení stylů a statických souborů použí jinou
adresu a nebo si to něčím prefixni – /_admin/js… Popř.
/static/admin/js/ atp.
Mimcohodem… RouteList můžeš libovolně vnořovat. Pro aktuální verzi sandboxu to platí samozřejmě taky.
Editoval Tomáš Kolinger (16. 1. 2013 12:39)
- doublemcz
- Člen | 15
enumag napsal(a):
Odeber z htaccess tento řádek. Jeho smysl jsem stejně nikdy nepochopil.
RewriteCond %{REQUEST_FILENAME} !-d
Bohužel bez úspěchu. Vyzkoušel jsem všechny varianty a i předělat router podle toho příkladu co je v examplech. Jediná funkční cesta je přejmenovat ten folder admin na cokoliv jiného. Nicméně tenhle workaround se mi moc nelíbí. Stále doufám, že tohle stačí dobře nastavit v .htaccessu ale to je neskutečná alchymie. :-/