Ochrana aplikačních souborů
- pmg
- Člen | 372
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
.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
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
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
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)?
- romansklenar
- Člen | 655
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ší :)
- romansklenar
- Člen | 655
<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 HttpRequest
u.
Řešení s
Environment::getHttpRequest()->getUri(FALSE)->scriptPath
už
ale nejde použít, protože UriScript
je frozen.
- pmg
- Člen | 372
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
pmg napsal(a):
Jenže Nette změnu během routování vrátí,
Pokusil jsem se to fixnout.