Routování „.co.uk“ domény – vícejazyčný web s více doménami

Desttro
Člen | 126
+
0
-

Dobrý den,
chci se s Vámi poradit ohledně rout pro vícejazyčkný web. Ve svém projektu používám Kdyby/Translation.

Mám domény:

  • priklad.cz
  • priklad.sk
  • priklad.pl
  • priklad.de
  • priklad.at
  • priklad.uk
  • priklad.co.uk
  • priklad.com

Když použiju tuto routu a zadám www.priklad.co.uk do prohlížeče, tak vše funguje jak má:

public static function createRouter()
{
$router = new RouteList;
$router[] = new Route('//www.priklad.co.<locale>/<presenter>/<action>[/<id>]', [
    'presenter' => 'Homepage',
    'action' => 'default',
    'id' => null,
    'locale' => [
        Route::FILTER_TABLE => [
            'uk' => 'en'
        ]
    ]
]);
$router[] = new Route('//www.%sld%.<locale>/<presenter>/<action>[/<id>]', [
    'presenter' => 'Homepage',
    'action' => 'default',
    'id' => null,
    'locale' => [
        Route::FILTER_TABLE => [
            'cz' => 'cz',
            'sk' => 'sk',
            'pl' => 'pl',
            'at' => 'de',
            'de' => 'de',
            'uk' => 'en',
            'com' => 'en'
        ]
    ]
]);
return $router;

Když ale routy prohodím, a zadám www.priklad.co.uk tak mě to přesměruje akorát na co.com a nepohnu s tím dál, jako kdyby router ignoroval co je potom:

public static function createRouter()
{
    $router = new RouteList;
    $router[] = new Route('//www.%sld%.<locale>/<presenter>/<action>[/<id>]', [
        'presenter' => 'Homepage',
        'action' => 'default',
        'id' => null,
        'locale' => [
            Route::FILTER_TABLE => [
                'cz' => 'cz',
                'sk' => 'sk',
                'pl' => 'pl',
                'at' => 'de',
                'de' => 'de',
                'uk' => 'en',
                'com' => 'en'
            ]
        ]
    ]);
    $router[] = new Route('//www.priklad.co.<locale>/<presenter>/<action>[/<id>]', [
        'presenter' => 'Homepage',
        'action' => 'default',
        'id' => null,
        'locale' => [
            Route::FILTER_TABLE => [
                'uk' => 'en'
            ]
        ]
    ]);
    return $router;
}

Nejradši bych to všechno sjednotil do jedné routy nějak takhle:

$router[] = new Route('//www.%sld%.<locale>/<presenter>/<action>[/<id>]', [
    'presenter' => 'Homepage',
    'action' => 'default',
    'id' => null,
    'locale' => [
        Route::FILTER_TABLE => [
            'cz' => 'cz',
            'sk' => 'sk',
            'pl' => 'pl',
            'at' => 'de',
            'de' => 'de',
            'uk' => 'en',
            'co.uk' => 'en',
            'com' => 'en'
        ]
    ]
]);

Ale nedaří se mi. v BasePresneteru mám samořejmě

/** @persistent */
public $locale;

Chěl bych aby když uživatel zadá následující adresy, aby se přepl jazyk a také koncovka domény, ke které daný jazyk patří:

  • priklad.cz = čeština (cz)
  • priklad.sk = slověnština (sk)
  • priklad.pl = polština (pl)
  • priklad.de = němčina (de)
  • priklad.at = němčina (de)
  • priklad.uk = angličtina (en)
  • priklad.co.uk = angličtina (en)
  • priklad.com = angličtina (en)

Bohužel se mi tohle nedaří definovat do routy.

Také bych chtěl, aby web fungoval jak s www tak bez www přípony – teď to mám tak, že mám úplně dvě stejné definované routy a jednu s a druhou bez www přípony, ale web respektuje jen tu první – vždycky tam přidá www, i když zadám bez www.

Budu rád za jakoukoliv pomoc, děkuji!

kolsi
Člen | 131
+
0
-

V podstatě stejný problém jsem psal před několika dny u vedlejšího tématu – bez odpovědi.

Problém je v tom, že při generování odkazů Nette vezme první routu, která vygeneruje odkaz, bez ohledu na to, zda se doména shoduje s aktuální. A jelikož se při startu aplikace Nette snaží udělat URL co nejhezčí, prožene ji touto první funkční routou, která má za následek přesměrování na jinou doménu.

David Grudl
Nette Core | 8082
+
+2
-

Skutečně chceš mít stejnou verzi na třech různých doménách, tj. priklad.uk, priklad.co.uk a priklad.com? Duplicitu obsahu penalizuje Google.

kolsi
Člen | 131
+
+1
-

Tak já nevidím důvod, proč by na různých doménách nemohla běžet stejná instance webu. Obsah samozřejmě může být jiný, např. pro různé domény jiný jazyk. Můžu mít priklad.cz, která zobrazí českou mutaci, a example.com, která zobrazí stejný web ale v angličtině atd.

Nebo v našem případě třeba máme produkční a vývojovou verzi na různých doménách a z určitých důvodů potřebujeme mít pro oba případy různou routu, ale chceme mít jeden kód.

Jenže v současné době, když udělám za sebou 2 routy, např. tedy priklad.cz a example.com, tak při přístupu na example.com Nette okamžitě přesměruje na priklad.cz.

Desttro
Člen | 126
+
0
-

David Grudl napsal(a):

Skutečně chceš mít stejnou verzi na třech různých doménách, tj. priklad.uk, priklad.co.uk a priklad.com? Duplicitu obsahu penalizuje Google.

Něco jsem si o tom načetl a máš pravdu, budu „non-www“ requesty směrovat pomocí 301 na https://www.priklad.tld

Moc děkuji za nasmerování!

Editoval Desttro (22. 5. 2018 7:01)