Spatna detekce basePath pri specificke konfiguraci serveru (zejmena mod_vhost_alias)

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

Ahoj, na aktuálním Nette 2.0.3 (namespace verze) a PHP 5.3 je spatne detekovana basePath, pokud je $_SERVER[‚DOCUMENT_ROOT‘] jiny (zpravidla o 1-x urovni vys nez je skutecny document root). Na testovacim serveru pouzivam mod_vhost_alias, ktery mi preklada subdomeny na adresare. Jak to funguje vysvetlim na prikladu:

  • Dejme tomu, ze hostname je example.com
  • Adresarova struktura (zjednodusene) je:
  • /var/www/
  • /var/www/web1/
  • /var/www/web2/
  • DocumentRoot (a tedy i $_SERVER[‚DOCUMENT_ROOT‘] je /var/www
  • VirtualDocumentRoot (z modulu vhost_alias) je nastaven na /var/www/%-3+.
  • Diky tomu se subdomena 3. a vyssiho radu preklada na adresare, nasledovne:
  • web1.example.com -> /var/www/web1
  • web2.example.com -> /var/www/web2
  • cokoliv.co.chci.example.com -> /var/www/cokoliv.co.chci

Tento postup mi umoznuje provozovat neomezene subdomen (slo by to samozrejme i domeny nizsiho radu) v ruznych adresarich se zakladni cestou „/“, aniz bych pro ne musel zvlast zakladat VirtualHosty. Ovsem modul vhost_alias nemeni realny DocumentRoot, a tudiz promenna $_SERVER[‚DOCUMENT_ROOT‘] je i pro subdomeny nastavena na na /var/www. To funguje dobre, pokud opravdu nepouzivam podadresar.

Pokud pouziju web1.example.com/testsubdir jako zakladni cestu k projektu („testsubdir“ ma byt basePath), Nette to nedetekuje a basePath je stale „/“ a pathInfo je /testsubdir/moje/url.

$_SERVER potom vypada nejak takto:
["DOCUMENT_ROOT"]=> "/var/www",
["SCRIPT_FILENAME"]=> "/var/www/web1/testsubdir/index.php",
["REQUEST_URI"]=> "/testsubdir/moje/url",
["SCRIPT_NAME"]=> "/testsubdir/index.php",
["PHP_SELF"]=> "/testsubdir/index.php"

Resenim v tomto pripade je z REQUEST_URI odstranit zacatek ktery se rovna dirname($_SERVER[‚SCRIPT_NAME‘]). Nevim, jestli je toto reseni univerzalni. Moje otazka je, jestli je nejake jine reseni, nejake spravne, nebo jestli jste tento problem taky nekdy resili. Jedna se mi hlavne o spravne nastaveni scriptPath a tim padem i pathInfo – skutecna cesta v aplikaci.

PS: Tento problem je soucasne i timto: https://forum.nette.org/…updatu-nette avsak nabizene reseni je cunarna.

Editoval KingKoca (5. 7. 2012 22:03)

KingKoca
Člen | 25
+
0
-

Aha, tak se omlouvam, zjistil jsem problem u sebe.

Pokud jsem mel potomka tridy UrlScript a do constructoru jsem mu dal
parent::__construct($request->getUrl()->getAbsoluteUrl());, tak ten potomek mel spatne cesty.

Ovsem puvodni $request->getUrl() objekt ma tyto cesty spravne a v poradku. Upravil jsem svuj kod, abych nepouzival potomka UrlScript, ale pouzil primo objekt z HttpRequestu.

Muj novy dotaz je: Mohu nejakym zpusobem udelat potomka tridy UrlScript (potrebuju rozsirit jeho funkcnost) tak, aby parsovana Url mela spravne vlastnosti? Diky za radu