document_root – simulace pomoci mod_rewrite
- washo
- Člen | 88
Chtel jsem se zeptat, jak byste resili situaci kdy na hostingu nelze nastavit document_root na document_root a chteli byste to simulovat pomoci mod_rewrite?
neco na zpusob
RewriteBase /forum/
RewriteCond %{REQUEST_URI} !^/forum/document_root/.*$
RewriteRule ^(.*)$ document_root/$1 [L,QSA]
kdy chcete aby vsechno co jde na www.example.com/forum
slo na adresar /forum/document_root?
narazil jsem na problem pri autodetekci baseUri a od toho se odvici celkove nefunkcni vsechno.
Rikal jsem si ze si napisu svoji autodetekci ale mozna to jde resit jednoduseji. ?
Editoval washo (8. 2. 2009 16:23)
- washo
- Člen | 88
Ta uprava autodetekce je v detectUri() v HttpRequestu takova
<?php
//....
} elseif (strncmp($uri->path, $scriptPath, strrpos($scriptPath, '/') + 1) === 0) {
// directory portion of $scriptPath in URL
$uri->scriptPath = substr($scriptPath, 0, strrpos($scriptPath, '/') + 1);
} elseif (strlen($common = Washo_String::commonPart(dirname($scriptPath),$uri->path)) > 1) {
// if scriptPath has common begin with $uri->path
$uri->scriptPath = $common;
} elseif (strpos($uri->path, basename($scriptPath)) === FALSE) {
// no match whatsoever; set it blank
$uri->scriptPath = '/';
//....
?>
asi je to blbost ale jine reseni me nenapadlo.
Jo a jeste
ma php nakou funkci ktera dela to co Washo_String::commonPart ?
Dela proste to, ze vrati spolecnou cast dvou retezcu.
Me se zadnou takovou nepodarilo najit.
Editoval washo (8. 2. 2009 16:57)
- nAS
- Člen | 277
A není jednodušší do toho adresáře www.example.com/forum dát dovnou obsah document_root a jenom v index.php změnit cesty?
- washo
- Člen | 88
nAS napsal(a):
A není jednodušší do toho adresáře www.example.com/forum dát dovnou obsah document_root a jenom v index.php změnit cesty?
No jednoduzsi to je, ale ja to chcu mit v jinem adresari proste.
- washo
- Člen | 88
phx napsal(a):
Osobne mam app, libs, temp a spol v jednom adresari. Osetreni resim pres .htaccess. Jen se musi spravne nastavit cesty.
No to jede. Kdybych to tak mel tak to pojede. Ale prijde mi celkem sympaticke mit public alias document_root zvlast v adresari. A tak resim tenhle problem.
Editoval washo (8. 2. 2009 22:19)
- phx
- Člen | 651
Ted stelim od boku. Co takto?
# 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)$ document_root/index.php [L]
RewriteRule ^(.*)$ document_root/$1 [L, QSA]
- David Grudl
- Nette Core | 8221
Vnutit jiné hodnoty autodetekci by mělo jít přes:
Environment::getHttpRequest()->getUri(FALSE)->scriptPath = ...;
scriptPath viz scriptPath
- Jan Tvrdík
- Nette guru | 2595
washo napsal(a): A tak resim tenhle problem.
Jak to nakonec dopadlo? Našel jsi nějaké schůdné funkční řešení?
- washo
- Člen | 88
Jan Tvrdík napsal(a):
washo napsal(a): A tak resim tenhle problem.
Jak to nakonec dopadlo? Našel jsi nějaké schůdné funkční řešení?
No…
Zatim pouzivam doporuceni pana tovarnika:
Environment::getHttpRequest()->getUri(FALSE)->scriptPath = '/neco/';
v bootstrapu.
casem pouziju (az v nette budu delat i jiny web):
Environment::getHttpRequest()->getUri(FALSE)->scriptPath = Washo_HttpRequest::autodetectScriptPath();
ve ktere vyuziju spolecnou cast uri (bez domeny) a file (bez casti obsazene
v APP_DIR) a pak zkusim na nette srazu Davida ukecat at tu autodetekci dodela
primo do nette :)
Jinak pouzivam ten .htaccess uvedeny nekde vyse.
- washo
- Člen | 88
nAS napsal(a):
A není jednodušší do toho adresáře www.example.com/forum dát dovnou obsah document_root a jenom v index.php změnit cesty?
Bacha pro ty co to delaj s document_rootem stejne blbe jako ja.
http://php.vrana.cz/…ni-nette.php#…
- _Martin_
- Generous Backer | 679
washo napsal(a):
Bacha pro ty co to delaj s document_rootem stejne blbe jako ja.
http://php.vrana.cz/…ni-nette.php#…
Přemýšlím, zda jen náhodou se krátce po zveřejnění tohoto článku
objevil v error logu na serveru ddmp6.cz neúspěšný pokus na neexistující
soubor http://www.ddmp6.cz/app/config.ini
. Zvláštní, říkám
si, že by někdo zkoušel všechny známé Nette weby? Třeba jsem jen malinko
paranoidní… =)
- washo
- Člen | 88
_Martin_ napsal(a):
washo napsal(a):
Bacha pro ty co to delaj s document_rootem stejne blbe jako ja.
http://php.vrana.cz/…ni-nette.php#…Přemýšlím, zda jen náhodou se krátce po zveřejnění tohoto článku objevil v error logu na serveru ddmp6.cz neúspěšný pokus na neexistující soubor
http://www.ddmp6.cz/app/config.ini
. Zvláštní, říkám si, že by někdo zkoušel všechny známé Nette weby? Třeba jsem jen malinko paranoidní… =)
No ja jsem to taky zkousel. A taky proc bych to nezkusil ze :) Ne ze bych si chtel pripadat jako nejaky hacker, ale zajimalo me kdo vsechno dodrzuje doporuceni mit app, lib atd mimo doc_root. Tak u koho mi to vyhodi 403 tak na to asi sere a u koho 404 tak to ma nejspis oddelene.
Zkousim to nasimulovat ten nevhodne nakonfigurovany apache a nejak mi to nejde,
ve vhostu
<VirtualHost *:80>
DocumentRoot "W:/wwwdata/htdocs_nettetest/"
ServerName nettetest.localhost
</VirtualHost>
<Directory "W:/wwwdata/htdocs_nettetest/">
Options Indexes FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
a stary skeleton a stejne to nejde dostat se na config.ini . Jediny problem
nastane kdyz chybi directiva AllowOverride All
ale to
je jasne.
- romansklenar
- Člen | 655
Ono to někdy ani nejde oddělit, přesně z toho důvodu co píšeš na začátku nebo například když ti root ftp začíná adresářem www/public_html/document_root a o úroveň výš se prostě nedostaneš.
- phx
- Člen | 651
Ale kde ma apache document_root, kam muze ftp a kde vsude muze PHP jsou 3 ruzne veci.
- document_root (vhost v apache)
- php (openbase_dir)
- ftp (nevim neznam nekonfiguroval jsem nikdy)
Osobne ale document_root nepouzivam. Mam adresar webu kde jsou adresare jako app a libs kde je pristup zakazan pomoci .htaccess
- Roman Ožana
- Člen | 52
zakjan napsal(a):
U mě to vypadá asi takhle – adresáře:
/ (apache document_root pro doménu) /application /library /public
/.htaccess
RewriteEngine on RewriteRule ^(.*)$ public/$1
/public/.htaccess je původní z Nette
Nic víc netřeba a funguje to :)
No jo a co duplicita obsahu? Funguje jak www.cokoliv.cz tak www.cokoliv.cz/public
Nemá někdo nějaké dobré řešení?
Někde jsme našel tohle:
RewriteCond %{THE_REQUEST} ^GET\ /public/
RewriteRule ^public/(.*) /$1 [L,R=301]
RewriteRule !^public/ public%{REQUEST_URI} [L]
Editoval Roman Ožana (26. 1. 2010 15:59)
- mroharik
- Člen | 3
ahoj, omlouvam se za novackovsky dotaz, ale nemate nekdo htaccess pro blueboard hosting pri zachovani doporucovane adresarove struktury a nahrani aplikace do rootu na ftp? doufam, ze jsem se vyjadril srozumitelne.
kod:
RewriteEngine on
RewriteRule ^(.*)$ document_root/$1
ktery je uvedeny vyse, mi nefunguje, nevim proc :(
mockrat dekuju
- Roman Ožana
- Člen | 52
Našel jsem celkem hezký htaccess pro Zend Framework vypadá že tam je snad vše.
- Vojtěch Vondra
- Člen | 11
phx napsal(a):
Ted stelim od boku. Co takto?
# 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)$ document_root/index.php [L] RewriteRule ^(.*)$ document_root/$1 [L, QSA]
Nepříjmená chyba v tom poslední pravidle – před QSA nesmí být mezera.
- setka
- Člen | 10
Právě jsem narazil na problém s autodetekcí scriptPath
v HttpRequestu, jak popisuje druhý post v tomto tématu.
Na firemním hostingu používáme řešení mapování subdomén na adreáře přes mod_rewrite v Apache configu. Přesné řešení není podstatné, nicméně je podobné tomu, co je naznačeno v prvním postu a funguje velmi dobře až na problém s tou detekcí scriptPath.
- Apache document root máme nastaven na např.
/var/www/firma.cz/
- pomocí rewrite pravidel je „efektivní“ document root
/var/www/firma.cz/www/
nebo třeba/var/www/firma.cz/subdomains/nejakasubdomena/
.
Když je nette aplikace přímo v kořenovém adresáři, ať už hlavním,
nebo v subdoméně, uplatní se v detectUri()
v bloku, který
začíná komentářem:
// Does the scriptPath have anything in common with the request_uri?
fallback scriptPath
na /
a vše je v pořádku.
Pokud je ovšem aplikace v nějaké složce, tj. situace:
/var/www/firma.cz/www/forum/index.php
kdy scriptPath
by mělo být rovno /forum
, tak
detectUri()
selže, protože:
$_SERVER[‚SCRIPT_NAME‘] ⇒ „/www/forum/index.php“
a
$_SERVER[‚REQUEST_URI‘] ⇒ „/forum/nejaka/cesta/co/zpracuje/router“
pak ve funkci detectUri()
dojde k situaci, že:
$uri->path => /forum/nejaka/cesta/co/zpracuje/router
$scriptPath => /www/forum/index.php
Můj návrh řešení (kromě ručního nastavení scriptPath:
před fallback na /
se pokusit o detekci tak, že ze scriptPath
odřízneme název souboru (zde index.php) a bude to vypadat asi tak:
<?php
dirname($scriptPath): /www/forum
$uri->path: /forum/nejaka/cesta/...
?>
Zformátoval jsem to tak, že je patrná společná část, jakýsi
„průnik“ obou řetězců. No a tuto společnou část bych použil jako
scriptPath
. Nevím ale, jestli se tím nerozbije chování
v jiných případech. Asi bych tu navrhovanou metodu doplnil do bloku, kde je
teď fallback na /
. Nenapadá mě teď ani jak to porovnání
algoritmicky elegantně řešit. Možná někdo hned uvidí, že tahle metoda
stejně v určitých případech selže. Co si o tom myslíte?
Edit:
David Grudl napsal(a):
Vnutit jiné hodnoty autodetekci by mělo jít přes:
Environment::getHttpRequest()->getUri(FALSE)->scriptPath = ...;
teď jsem zjistil, že to ruční nastavení nefunguje. Skončí s tím, že
Cannot
modify a frozen object ‚UriScript‘. Funkce getUri
nebere
žádný parametr (koukal jsem i na akatuální verzi do SVN).
Editoval setka (4. 7. 2010 15:30)