$basePath v Presenteru – z Template nebo HttpRequest – pokaždé jiná hodnota?
- m.brecher
- Generous Backer | 871
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 | 1274
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 | 820
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 | 871
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 | 871
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 | 8227
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 | 8227
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.