Ochrana aplikačních souborů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pmg
Člen | 372
+
0
-
document_root
 |
 + subdoména
    |
    + app
    |
    \ www

Jestliže na hostingu nemáte možnost skrýt své aplikační soubory, můžete to vyřešit jedním souborem .htaccess v rootu webu.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{REQUEST_URI} !^/[^/]+/www/
RewriteCond %{REQUEST_URI} ^/([^/]+)/
RewriteRule (.*) /%1/www/$1 [QSA]

Zatímco si druhé pravidlo vynucuje přítomnost www za subdoménou, první pravidlo šest véček odebírá. Dobrý, ne? Nejlepší na tom je, že řešení není závislé na názvu domén / serveru.

romansklenar
Člen | 655
+
0
-

.htaccess byl, je a asi i navždy bude pro mě úplné woodoo. Kdyby někdo doved sepsat pravidlo, které by například adresu příkladu fifteen na localhostu, kde je více projektů v jednotlivých složkách, přepisovalo z http://localhost/fifteen/?do=fifteen-shuffle na http://localhost/fifteen/document_root/?do=fifteen-shuffle a zároveň přesměrovávalo naopak (tak aby se při zadání tvaru s document_root přesměrovalo na tvar bez něj a následně přepsalo pomocí pravidla) tak by měl můj obdiv :)

Pro mě je to nereálný úkol ikdyž se už na fóru podobné problémy řešily.

Jan Tvrdík
Nette guru | 2595
+
0
-

romansklenar napsal(a):

.htaccess byl, je a asi i navždy bude pro mě úplné woodoo.

Pro mě taky. Mimochodem stojí to i v jeho dokumentaci:

Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo.

(Brian Moore, bem@news.cmc.net)
http://httpd.apache.org/…rewrite.html

pmg
Člen | 372
+
0
-

Pro debugování pravidel je zatraceně dobré zapnout si logování v httpd.conf:

RewriteLog "${path}/apache/logs/rewrite.log"
RewriteLogLevel 5

Dále se může hodit používat na lokálu jiný název pro soubor .htaccess, není potřeba nic upravovat před uploadem na server.

AccessFileName .htlocal
RewriteEngine On

# doplní koncová lomítka
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .*[^/]$ /$0/ [R=301,NE,QSA]

# přesměruje při ručním zadání delší varianty
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} ^/([^/]+)/document_root/(.*)
RewriteRule .* /%1/%2 [R=301,NE,QSA,L]

# přesměruje na delší variantu
RewriteCond %{REQUEST_URI} ^/[^/]+/
RewriteCond %{REQUEST_URI} !^/[^/]+/document_root/
RewriteRule ([^/]+)/(.*) /$1/document_root/$2 [NE,QSA,L]
Ondřej Mirtes
Člen | 1536
+
0
-

A není jednodušší nastavit si správně virtualhosta v httpd.conf, případně si to nastavit ve webhostingové administraci/požádat administrátora a v nejhorším případě zvolit jinou složkovou strukturu (a ujistit se, že app/ a libs/ jsou skryté pomocí .htaccess)?

pmg
Člen | 372
+
0
-

Nejjednodušší je zeptat se na fóru.

romansklenar
Člen | 655
+
0
-

pmg napsal(a):

Děkuji, děkuji, děkuji a ještě jednou děkuji :)

LastHunter napsal(a):

A není jednodušší nastavit si správně virtualhosta v httpd.conf, případně si to nastavit ve webhostingové administraci/požádat administrátora a v nejhorším případě zvolit jinou složkovou strukturu (a ujistit se, že app/ a libs/ jsou skryté pomocí .htaccess)?

Je, ale často měním strukturu a otravuje mě to pořád přepisovat, tohle je bezstarostnější/pohodlnější :)

pmg
Člen | 372
+
0
-

Děkuji Romane, za poslední rok mě nic nepotěšilo víc než poděkování Romana Sklenáře, jednoho z nejvýznamnějších lidí kolem. Asi si příspěvek vytisknu a dám nad postel. Ještě doufám, že to bude fungovat.

romansklenar
Člen | 655
+
0
-

<sarkasm>

pmg napsal(a):

Děkuji Romane, za poslední rok mě nic nepotěšilo víc než poděkování Romana Sklenáře, jednoho z nejvýznamnějších lidí kolem. Asi si příspěvek vytisknu a dám nad postel. Ještě doufám, že to bude fungovat.

</sarkasm>

Jo funguje to, jen přepis adresy asi způsobí nesprávnou autodetekci v HttpRequestu.

Řešení s Environment::getHttpRequest()->getUri(FALSE)->scriptPath už ale nejde použít, protože UriScript je frozen.

pmg
Člen | 372
+
0
-

Zrovna té detekce jsem se obával.

$request = Environment::getHttpRequest();
$uri = clone $request->getUri();
$uri->setScriptPath($value);
$request->setUri($uri);
pmg
Člen | 372
+
0
-

Celé by to mohlo vypadat třeba takto, trochu to nahrává použití VirtualHost.

$request = Environment::getHttpRequest();
$uri = $request->getUri();
$host = $uri->getHost();

if ($host === 'localhost') {
	$uri = clone $uri;
	$path = strtr(substr(dirname(WWW_DIR) . '/', strlen($_SERVER['DOCUMENT_ROOT'])), '\\', '/');
	$uri->setScriptPath($path);
	$request->setUri($uri);
}

Jenže Nette změnu během routování vrátí, přesněji když se při detekci parametrů dotazu zavolá HttpRequest::getQuery(), která znovu zavolá metodu initialize. To je průšvih.

David Grudl
Nette Core | 8228
+
0
-

pmg napsal(a):

Jenže Nette změnu během routování vrátí,

Pokusil jsem se to fixnout.

pmg
Člen | 372
+
0
-

Děkuji a samostatný request jsem smazal. Přesunuji sem svůj malý tip:

Tady by možná bylo lepší $old = error_reporting(error_reporting() & ~E_NOTICE);.