$basePath v Presenteru – z Template nebo HttpRequest – pokaždé jiná hodnota?

- m.brecher
 - Generous Backer | 911
 
Vyvíjím více projektů Nette na lokálním serveru současně a mám projekty ve složkách docRoot serveru Apache takto:
- /www/projek1/www/
    - /projekt2/www/
kde první /www/ je namapováno na doménu localhost, vnořené /www/ je wwwDir nette projektu.
Zjistil jsem, že cookie session se nastavují s platností pro celou doménu localhost, tj. pro celý top adresář /www/. To má za následek, že se mezi všemi projekty sdílí PHPSESSID a User v jednom projektu je v tracy-bar vidět v ostatních projektech.
Vše by vyřešila konfigurace php.ini session.cookie_path = $basePath.‚/‘.
Zkoušel jsem dvě varianty v $presenter->startup():
$basePath = $presenter->getHttpRequest()->getUrl()->getBasePath();	  // vypíše /projekt1/www/
$basePath = $presenter->getHttpRequest()->getUrl()->basePath;	      // vypíše /projekt1/www/
$basePath = $presenter->template->basePath;	                          // vypíše /projekt1/www
První otázka – dělám něco špatně, že různé metody vracejí různé hodnoty $basePath, nebo je to vlastnost frameworku ?
O to ale zase tolik nejde – správnou hodnotu $basePath přes template v presenteru už mám, jenom potřebuji šikovně nakonfigurovat session.
V local.neon jsem zkoušel tento kód který bezpečně funguje:
session:
    cookiePath: '/projekt1/www/'
Úplně spokojen ale nejsem, protože při změně adresářové struktury, nebo přejmenování kořenové složky projektu toto řešení nebude fungovat a nemusí se na to vůbec přijít.
Druhá otázka – potřebuji poradit :
- buďto jak provést identickou konfiguraci v local.neon metodami v presenteru – tam už mám $basePath k dispozici
 - nebo jak dostat parametr $basePath z Presenteru do local.neon třeba jako %basePath%
 
Pátral jsem hodiny v dokumentaci Nette bez výsledku. Díky za jakékoliv info.
Editoval m.brecher (28. 9. 2021 18:51)

- Marek Bartoš
 - Nette Blogger | 1313
 
Proč je to tak jak je nevím, ale řešení bych měl :)
session:
	cookiePath: @Nette\Http\IRequest::getUrl()::getBasePath()
Vygenerovaný kód v DIC by měl vypadat takto
'cookiePath' => $this->getService('http.request')->getUrl()->getBasePath(),
Editoval Marek Bartoš (23. 9. 2021 22:25)

- Kamil Valenta
 - Člen | 846
 
Není lepší si v hosts definovat „lokální domény“ a simulovat
provoz projektů na reálných doménách?
Tedy example.cz vs. example.loc, example2.cz vs. example2.loc etc.
Když se válí vše pod localhost/<path>, člověk nenasimuluje vše.

- m.brecher
 - Generous Backer | 911
 
Marek Bartoš napsal(a):
Proč je to tak jak je nevím, ale řešení bych měl :)
session: cookiePath: @Nette\Http\IRequest::getUrl()::getBasePath()Vygenerovaný kód v DIC by měl vypadat takto
'cookiePath' => $this->getService('http.request')->getUrl()->getBasePath(),
@MarekBartoš funguje to SUPR, zase jsem o něco více nette-chytřejší, dík :)

- m.brecher
 - Generous Backer | 911
 
Kamil Valenta napsal(a):
Není lepší si v hosts definovat „lokální domény“ a simulovat provoz projektů na reálných doménách?
Tedy example.cz vs. example.loc, example2.cz vs. example2.loc etc.Když se válí vše pod localhost/<path>, člověk nenasimuluje vše.
@KamilValenta zajímavá myšlenka simulovat domény v souboru localhost, myslel jsem, že bych si musel doma nainstalovat celý dns server :)

- David Grudl
 - Nette Core | 8285
 
Stačí do souboru hosts přidat
nette.l   127.0.0.1
www.nette.l   127.0.0.1
forum.nette.l   127.0.0.1
Povolit v Apache:
<VirtualHost *>
    DocumentRoot "W:/.../www"
    ServerName nette.l
    ServerAlias *.nette.l
</VirtualHost>
A ještě je fajn rozjet na lokále https pomocí https://github.com/…ttile/mkcert, ale není to samozřejmě nutné. Pak se to opět zapne na Apache nastavením SSLCertificateFile, SSLCertificateKeyFile a:
<VirtualHost *:443>
    DocumentRoot "W:/.../www"
    ServerName nette.l
    ServerAlias *.nette.l
    SSLEngine on
</VirtualHost>
				
- David Grudl
 - Nette Core | 8285
 
Ad getHttpRequest()->getUrl()->getBasePath() vs
$basePath – liší se v tom lomítku na konci, asi
z nějakých historických důvodů. Zjistím, jestli by to šlo v další
verzi sjednotit, nebo by to byl příliš velký BC break.