Špatný UrlScript::scriptPath

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

Narazil jsem na poměrně zvláštní chování, nejsem si jist jestli za to může nette, nebo nastavení php.

Na serveru máme ISPconfig, a subdomény řešíme jako složky u konkrétního webu s přesměrováním L. Pokud mám web na nette na doméně samotné, všechno jede krásně. Pokud ho mám ale na subdoméně a zároveň ve složce (tzn http://sub.domena.cz/slozka), špatně se generuje scriptPath (je v něm jen lomítko místo složky, ve které web běží. Pokud web není ve složce, všechno funguje správně (pak totiž to lomítko samotné je správně). Podle zdrojáků jsem koukal, že to lomítko je defaultní hodnota.

Setkal se s tím už někdo?

Ještě dodám, že když jsem si ve vlastním routeru nastavil ve funkci match scriptPath manuálně (správně), tak se to celé přesměruje na adresu bez složky (takže mimo celou aplikaci). Takhle to tedy obejít nejde.

Melmen
Člen | 132
+
0
-

A toje takovej problém v ISPConfig vytvořit „vlastní doménu“ pro tu subdoménu ?

B4nan
Člen | 13
+
0
-

Ale v čem je problém. Je to tedy v tom přesměrování? Nejde to obejít jinak?

Melmen
Člen | 132
+
0
-

Ted me napadlo, a co zkusit $basePath ?

B4nan
Člen | 13
+
0
-

Ale kde? Tohle je podle mě problém nette, že se špatně nastaví scriptPath… Protože když si ho manuálně nastavím v match správně, tak se stejně pak volá constructUrl, která vygeneruje správné url, tzn bez té složky, ale ve scriptPath ta složka také není, takže se to přesměruje do rootu té domény…

Nechce se mi to takhle obcházet. Ten hosting chceme normálně provozovat, takže když si klient chce vytvořit novou subdoménu, má jen tu možnost, jakou jsem popsal (tzn složka a na ní přesměrování).

Jinak si nechám rád i doporučit jiný nástroj než ISPconfig (klidně placený, když bude stát za to), je tam toho víc (hlavně to jak v něm fungují práva – nedají se tam moc používat root účty s přístupem ke všem doménám), co nám komplikuje život, ale to patří už jinam :)

petr.pavel
Člen | 535
+
0
-

Rád bych tohle téma oživil, právě jsem tím zabil hodinu.

Podle mě je chyba v /libs/Nette/Http/RequestFactory.php v metodě createHttpRequest(), konkrétně tady

Když tam moje aplikace dojde, má tyhle hodnoty:

$_SERVER['SCRIPT_FILENAME'] C:/xampp/htdocs/adresar.pp/domena.com/configuration/www/index.php
$_SERVER['DOCUMENT_ROOT']   C:/xampp/htdocs/adresar.pp/domena.com/
$_SERVER['REQUEST_URI']     /configuration/

$url->path     /configuration/
$script        /configuration/www/index.php

Testováno na dvou různých url, $_SERVER[‚REQUEST_URI‘] v obou případech obsahoval to samé, co $url->path:

http://domena.com/configuration/abc-dq/session/log-in
http://domena.com/configuration/

Ofixloval jsem to tím, že jsem strrpos() nahradil strpos($script, ‚/‘, 1), ale to funguje, jen když je Nette vnořené jen o jednu úroveň – v mém případě /configuration. Kdyby to bylo třeba /configuration/something, tak to fungovat zase nebude.

Ve skutečnosti to podle mě chce detekci nejdelšího společného řetězce.

Editoval petr.pavel (30. 12. 2011 12:05)

David Grudl
Nette Core | 8218
+
0
-

A co je v $_SERVER['REQUEST_URI]?

petr.pavel
Člen | 535
+
0
-

@David Grudl: Doplnil jsem.

David Grudl
Nette Core | 8218
+
0
-

Jestli to dobře chápu, $url->scriptPath má hodnotu /. Jakou hodnotu by podle tebe měl mít?

petr.pavel
Člen | 535
+
0
-

Ano, má hodnotu /. Koukám, že jsem to asi celé nějak špatně pochopil. :-)

Začal jsem u toho, že jsem očekával „/configuration“ v proměnné {$basePath} v šabloně Latte. Místo toho tam bylo „/“. Tak jsem hledal, odkud se její obsah bere, a našel tenhle $url->scriptPath.

Mám dost problémy pochopit, co se tam všechno děje a proč. Třeba v UrlScript::getBasePath(). V mém případě je tam

$this->scriptPath    /
$this->path          /configuration/

a funkce vrátí „/“. Není mi jasné, proč se tady vrací kus $this->path až do posledního lomítka v $this->scriptPath.

Možná by ještě prospělo, kdybych napsal, jak mám definovanou routu. Pro ty moje dvě url to je:

$baseDir = str_replace('/www/index.php', '', $_SERVER['SCRIPT_NAME']);	// "/configuration"
$router[] = $adminRouter = new NRouteList('Admin');
$adminRouter[] = new NRoute("$baseDir/abc-dq/<presenter>/<action>[/<id>]", 'Default:default');

$router[] = new NRoute("$baseDir/<presenter>/<action>[/<id>]", 'Default:default');
David Grudl
Nette Core | 8218
+
0
-

Jelikož Routy nepoužívají scriptPath, nemá to s nimi nic společného.

$basePath je část URL vedoucí k document_root, což odpovídá tvému nastavení $_SERVER[‚DOCUMENT_ROOT‘]

petr.pavel
Člen | 535
+
0
-

Sorry, to mi nějak hlava nebere.
$_SERVER[‚DOCUMENT_ROOT‘] je přeci nejčastěji cesta v rámci operačního systému k tomu, co je z pohledu webu root „/“. Jakou bych měl potřebu vkládat do šablony {$basePath}, když se můžu spolehnout, že to je „/“? Předpokládám, že jsem tě špatně pochopil. Můžeš mi to, prosím, vysvětlit?
Jedinou výjimku, kterou si dokážu představit, jsou aliasy Apache.

A když mám teda celé Nette v podadresáři, co mám udělat, abych v nějaké proměnné od Nette (v jaké?) dostal automaticky název toho podadresáře? Jestli to není {$basePath}, tak je potřeba upřesnit dost míst v dokumentaci (např. https://doc.nette.org/…n/presenters#…).

David Grudl
Nette Core | 8218
+
0
-

Máš pravdu, že hledání nejdelšího řetězce by mohlo být praktičtější, než celého. Používáš konfiguraci, se kterou jsem nepočítal. Jakým způsobem to mapování na index.php provádíš?

petr.pavel
Člen | 535
+
0
-

Dost prasácky, spěchal jsem :-)
Mám dva .htaccess, jeden v /configuration:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ www/$1 [L]
</IfModule>

a druhý v /configuration/www – standardní ze sandboxu poslední prefixed bety. Vím, že by to šlo zkombinovat, ale mám tak málo času, že dělám jen to nejnutnější.

Nette Framework 2.0-beta (revision c4a9fbb released on 2011–12–23)

petr.pavel
Člen | 535
+
0
-

Tak co, je problém v tom mém .htaccess nebo v Nette?

Filip Procházka
Moderator | 4668
+
0
-

Dá se tohle považovat za odpověď?

petr.pavel
Člen | 535
+
0
-

Jak se říká: „works for me“ :-) Díky chlapi.

badtaste
Člen | 9
+
0
-

Ahoj,
mel jsem zniceho nic pri prechodu na Nette Framework 2.0-beta ten samy problem. V sablone se mi v $basePath najednou vsude ukazovalo ‚/‘. Asi je to opravene v Nette Framework 2.0-rc2 ten problem zmizel.
Pouzivam Apache Alias directivu.