Dvě domény, jeden server – přesmerování

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

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
+
+2
-

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

iguana007
Člen | 970
+
+1
-

… jak píše David + bych vypustil parametr locale a pro přepínání jazyků bych využil přímo TLD domény .com|.cz ;)

blaztar
Člen | 93
+
0
-

Jo děkuji za rady. Já tam používal %domain% a pak jsem to v tom poli params neměl.

@iguana007
Díky za tip, ale ono to bude trošku komplikovanější. Ne všechny „locale“ budou mít vlastní doménu. (nepopsal jsem to úplně podrobně)

Editoval blaztar (13. 1. 2016 13:31)

blaztar
Člen | 93
+
0
-

Zas když přidám <domain> tam ho pak musím uvádět při generování odkazů ne?
Nějak se to komplikujete klasicky :)

David Matějka
Moderator | 6445
+
+1
-

dej si domain jako persistentni parametr do BasePresenteru

blaztar
Člen | 93
+
0
-

ty jo super :) díky moc

Kéž bych to nette/php taky jednou tak ovládal .)

blaztar
Člen | 93
+
0
-

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)

greeny
Člen | 405
+
0
-

Udělal bych to tak, že locale nebude mít defaultní hodnotu a pokud nebude nastavená, tak se použije hodnota z domény

Myiyk
Člen | 321
+
+1
-

@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)

blaztar
Člen | 93
+
0
-

Super, díky moc. FILTER_OUT jsem dosud vůbec nepoužíval

Myiyk
Člen | 321
+
0
-

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
+
0
-

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..

Myiyk
Člen | 321
+
0
-

Použij

'//<domain>/<locale=cs [a-z]{2}>'

ve fitru IN odstraň www, aby to bylo kompatibilní s doménama, jak je máš z DB.
ve fitru OUT přidej www, aby to bylo ve výsledku v adresách.

Editoval Myiyk (26. 1. 2016 14:40)

blaztar
Člen | 93
+
0
-

Díky za tip. Nakonec jsem to udělal jinak. Přidávání www pokud se nejedná o subnoménu udělám zkrs htaccess a těch pár domén v db si upravím na formát s www