Dvě domény, jeden server – přesmerování
- blaztar
- Člen | 93
Ahoj,
chtěl bych poprosit o radu.
Mám web kde běží dvě jazykové mutace.
cz: mujweb.cz/
en: mujweb.cs/en
Pro verzi EN mám novou doménu (mujweb.com) která míří na stejný server. Potřeboval bych toto chování..
Přijdu na:
mujweb.cz/en/m-3-contact
---> přesměruje mě to
mujweb.com/en/m3-contact
Nevím zda se to řeší už v htaccess (tomu moc nerozumím). Nejradši
bych to řešil až v routeru.
Děkuji za jakékoli popostrčení.. nějakou chvíli už na to koukám..
Současná routa:
$frontRoutes[] = new Route('/<locale=cs [a-z]{2}>/m-<menu_item_id [0-9]+>[-<menu_name>]', [
'presenter' => 'Homepage',
'action' => 'page',
NULL => [
Route::FILTER_IN => function (array $params) {
if ($params['locale']) {
$menu = $this->menuRepository->page($params['menu_item_id'], $params['locale']);
} else {
$menu = $this->menuRepository->page($params['menu_item_id']);
}
$params['menu_name'] = Strings::webalize(strip_tags(html_entity_decode($menu['name'])));
return $params;
},
Route::FILTER_OUT => function (array $params) {
return $params;
}
],
]);
Editoval blaztar (13. 1. 2016 13:06)
- David Matějka
- Moderator | 6445
v masce routy muzes pouzit domenu, treba
$frontRoutes[] = new Route('//www.<domain>/<locale=cs [a-z]{2}>/m-<menu_item_id [0-9]+>[-<menu_name>]'
a s tim domain parametrem pak muzes treba pracovat ve filtru
- blaztar
- Člen | 93
Tak další problémy :)
mám routu:
$frontRoutes[] = new Route('//[www.]<domain>/<locale=cs [a-z]{2}>', [
'presenter' => 'Homepage',
'action' => 'page',
NULL => [
Route::FILTER_IN => function (array $params) {
$params = $this->checkOwnDomain($params);
return $params;
},
Route::FILTER_OUT => function (array $params) {
return $params;
}
],
]);
private function checkOwnDomain($params)
{
if ($this->httpRequest->getUrl()->getRelativeUrl() === "") {
$domain = $this->setting->langByDomain($params['domain']);
if ($domain) {
$params['locale'] = $domain['name'];
}
}
$lang = $this->setting->langByName($params['locale']);
if (!$lang) {
throw new BadRequestException();
}
if ($lang['own_domain'] !== "" && $lang['own_domain'] !== $params['domain']) {
$params['domain'] = $lang['own_domain'];
}
return $params;
}
Mám problém s tím, že když má například německá jazyková mutace vlastní doménu (stejný server, aplikace) tak výsledná adresa po zadání např:
www.adresa.de -> www.adresa.de/de
Protože default locale je nastavený na cs. Dá se nějak udělat, aby pokud má jazyková mutace nastavenou svoji doménu tak aby ta výsledná adresa byla bez /locale
Pak na samostatný články apod mám jinou routu a tam už ten jazyk chci
mít. Jde jen o Homepage.
Díky za radu.
Editoval blaztar (26. 1. 2016 9:54)
- Myiyk
- Člen | 321
@blaztar Nedával bych defaultní hodnotu pro locale
Převod z url na request (filter IN) musí přepsat locale
na
správný jazyk, když locale
bude NULL
.
Převod z request na url (filter OUT) musí nastavit locale
na
NULL
, pokud je doména na stejném jazyce jako hodnota
locale
.
cca takhle, netestoval jsem to, ale mohlo by to fungovat
private $defaultLocale = array(
// domena => vychozi locale
'example.cz' => 'cs',
'example.ge' => 'ge',
);
$frontRoutes[] = new Route('//[www.]<domain>/<locale [a-z]{2}>', [
'presenter' => 'Homepage',
'action' => 'page',
NULL => [
Route::FILTER_IN => function (array $params)
{
// neni nastaven jazyk
if($params['locale'] == NULL) {
// domena je na seznamu
if(isset($this->defaultLocale[$params['domain']]) {
$params['locale'] = $this->defaultLocale[$params['domain']];
}
}
$params = $this->checkOwnDomain($params);
return $params;
},
Route::FILTER_OUT => function (array $params)
{
// pokud je domena stejneho jazyka jako locale
if(isset($this->defaultLocale[$params['domain']]) &&
$this->defaultLocale[$params['domain']] == $params['locale'])
{
// odstrani locale z adresy
$params['locale'] = NULL;
}
return $params;
}
],
]);
Editoval Myiyk (26. 1. 2016 10:25)
- Myiyk
- Člen | 321
Aby routování fungovalo, musí se převádět adresy obousměrně. A ve výchozím stavu je u presenteru zapnuta kanonizace, což je funkce která zkusí vygenerovat url, a když se neshodují s aktuální adresou, provede přesměrování.
- blaztar
- Člen | 93
jj díky za upřesnění.
Ještě koukám na ten začátek mé masky „//[!www.]“ a díky domu je
pak problém testovat něco na subdoméně.
Jako že dám subdomena.domena.cz a ono to vyrobí www.subdomena.domena.cz
a to nejede..
Vím že jedna varianta je nepoužít vykřičník a mít všechny adresy bew WWW, nicméně mám to přímo zadaný že to tam je potřeba. Se to furt komplikuje, hrůza..