Modul jmenující se stejně jako název složky vypisuje 404

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

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

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

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

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

@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)

enumag
Člen | 2118
+
0
-

Odeber z htaccess tento řádek. Jeho smysl jsem stejně nikdy nepochopil.

RewriteCond %{REQUEST_FILENAME} !-d
doublemcz
Člen | 15
+
0
-

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. :-/

enumag
Člen | 2118
+
0
-

Zkus ještě přidat tento řádek, pokud ani to nepomůže tak nevím.

DirectorySlash Off

(Ten RewriteCond výše nech zakomentovaný / smazaný.)

Editoval enumag (16. 1. 2013 23:23)