Route a subdoména

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

Jak je možné vytvořit routu na subdoménu která bude fungovat na jakékoliv doméně?

<?php
$router[] = new Route("//admin.host.com/ ? module=<presenter> & action=<action>", array(
    'presenter' => 'Admin:Bulletin',
    'action' => 'show',
));
?>

Tohle funguje ale pouze na doméně host.com.

Zkusil jsem:

<?php
$router[] = new Route("//admin.<host>/ ? module=<presenter> & action=<action>", array(
    'presenter' => 'Admin:Bulletin',
    'action' => 'show',
    'host' => NULL,
));
?>

Ale to pak generuje odkazy: admin./?module..., host je NULL…

David Grudl
Nette Core | 8218
+
0
-

nejlépe asi

$host = '...'; // z konfigu nebo index.php
$router[] = new Route("//admin.$host/ ? module=<presenter> & action=<action>", array(
    'presenter' => 'Admin:Bulletin',
    'action' => 'show',
));
kravčo
Člen | 721
+
0
-

Podľa mňa miešaš dve veci dohromady. „Premenná“ host je pre konkrétnu aplikáciu (na konkrétnom serveri) v podstate konštantná. Preto mi príde nelogické používať zobáky (<host>), keďže tými ja chápem premenné aplikácie. Skôr by som to riešil nejako takto:

<?php

$uri = Environment::getHttpRequest()->getUri();
$host = $uri->getAuthority();

$router[] = new Route("//admin.$host/?module=<presenter>&action=<action>", array(
    'presenter' => 'Admin:Bulletin',
    'action' => 'show',
));

?>

Problém v tejto implementácii je ten, že aplikácia ako taká nedokáže vo všeobecnosti zistiť, či má z hodnoty premennej $host odstrániť domény vyššieho rádu, alebo nie.

pre defaultnú stránku administrátorskej časti – povedzme http://admin.example.com/ – by táto routa nezbehla, keďže v premennej $host sa objaví celá autorita z URI = reťazec 'admin.example.com'.

Riešením môže byť zameranie na konkrétne názvy subdomén (www, admin) alebo na rád domény (vždy ponechať len druhý rád – takto je to v príklade nižšie), avšak otázkou zostáva čo s localhostom.

<?php

# ponechá len doménu druhého rádu (whatever.example.com -> example.com)
$host = preg_replace ('/^.*?(?=[^.]+\.[^.]+$)/', '', $host);
# alebo ekvivalentne
# $host = preg_replace ('/^.*?([^.]+\.[^.]+)$/', '$1', $host);

?>

Vyriešil niekto iný routovanie na subdomény?

Vyriešil…

Editoval kravco (29. 10. 2008 0:34)

LM
Člen | 206
+
0
-

„Premenná“ host je pre konkrétnu aplikáciu (na konkrétnom serveri) v podstate konštantná. Preto mi príde nelogické používať zobáky (<host>), keďže tými ja chápem premenné aplikácie.

Tím jsem se pokoušel obejít to že regulérní výraz můžu zadat pouze parametru…

Dík.

David Grudl
Nette Core | 8218
+
0
-

LM napsal(a):

Tím jsem se pokoušel obejít to že regulérní výraz můžu zadat pouze parametru…

Což má ale své opodstatnění – úkolem routy je nejen cestu naparsovat, ale i vygenerovat. Pokud bych tedy v masce uvedl něco jako [a-z]*, generování by nevědělo, co tam vložit.

LM
Člen | 206
+
0
-

David Grudl napsal(a):

LM napsal(a):

Tím jsem se pokoušel obejít to že regulérní výraz můžu zadat pouze parametru…

Což má ale své opodstatnění – úkolem routy je nejen cestu naparsovat, ale i vygenerovat. Pokud bych tedy v masce uvedl něco jako [a-z]*, generování by nevědělo, co tam vložit.

To vím, ale možná by tam nemuselo vkládat nic (edit. blbost…), parametry ze kterých má být vygenerováno url se nyní taky přes zadaný regexp nekontrolují: <id \d+> můžu předat parametr id=‚text‘ a vygeneruje se url které pak zpětně už neprojde.

Editoval LM (30. 10. 2008 17:11)