document_root – simulace pomoci mod_rewrite

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

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

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

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

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.

phx
Člen | 651
+
0
-

Osobne mam app, libs, temp a spol v jednom adresari. Osetreni resim pres .htaccess. Jen se musi spravne nastavit cesty.

washo
Člen | 88
+
0
-

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

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

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

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

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

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

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

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

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

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

zakjan
Člen | 9
+
0
-

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

Roman Ožana
Člen | 52
+
0
-

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

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

Našel jsem celkem hezký htaccess pro Zend Framework vypadá že tam je snad vše.

http://kbs.kimbs.cn/…nd-framework

Vojtěch Vondra
Člen | 11
+
0
-

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

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)