Špatný UrlScript::scriptPath
- B4nan
- Člen | 13
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.
- B4nan
- Člen | 13
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
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
Jestli to dobře chápu, $url->scriptPath má hodnotu /
.
Jakou hodnotu by podle tebe měl mít?
- petr.pavel
- Člen | 535
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
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
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
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
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)