Ten temat przewija się dosyć często, przygotowaliśmy więc łatwe i szybkie rozwiązanie. Oczywiście można to też rozwiązać (a nawet powinno się) po stronie serwera (poprzez odpowiednią konfigurację wirtualnego hosta w apache'u lub nawet w ostateczności w pliku .htaccess), ale... różnie bywa ;)
Jedyne czego potrzebujemy to serwera i skonfigurowanej opcji "wildcards". W skrócie to taka konfiguracja, gdzie wpisanie dowolnej subdomeny przed hostem niczego nie zmienia, czyli cały czas otwiera nam się nasza główna strona.
Tu należy się od razu informacja dla użytkowników wamp'ów, xampów i innych lamp'ów zainstalowanych na lokalnym Windows - na systemie windows uzyskanie "wildcards" wymaga niestety zainstalowania serwera DNS, więc zamiast tego lepiej dopisać sobie kilka "próbnych subdomen" do pliku "hosts" systemu Windows. Po więcej szczegółów odsyłam do Google
Do zrobienia mamy dwie rzeczy:
- Sprawdzić czy w adresie użyto subdomeny (i wyciągnąć ją z adresu jeżeli jest
potrzebna). Możemy to zrobić np. w ten sposób:
$host = 'nasz-glowny-adres.com'; $subdomena = str_replace($host, '', str_replace('www.', '', str_replace('.'.$host, '', $_SERVER['HTTP_HOST'])) ); - Podjąć stosowną akcję (przekierowanie, uruchomienie jakiejś funkcji itp.) Tutaj w zależności od tego co chcemy osiągnąć kod powinniśmy umieścić w odpowiednim miejscu. Poniżej znajdują się dwa najbardziej oczywiste przykłady.
Przykład 1
Na podstawie wpisanej domeny chcemy przekierować użytkownika do podkatalogu o tej samej nazwie co subdomena znajdującego się w app/webroot. Kod umieszczamy w app/app_controller.php w funkcji beforeFilter():
$host = 'nasz-glowny-adres.com';
$subdomena = str_replace($host, '',
str_replace('www.', '', str_replace('.'.$host, '', $_SERVER['HTTP_HOST']))
);
if(!empty($subdomena)) {
$this->redirect('tutaj-adres/'.$subdomena);
}
Oczywiście podobne przekierowanie możemy wykonać na dowolny inny adres.
Przykład 2
Dynamiczny routing na podstawie subdomen do wybranego kontrolera (i akcji) z subdomeną przesyłaną jako parametr. Kod umieszczamy w pliku app/config/routes.php
$host = 'nasz-glowny-adres.com';
$subdomena = str_replace($host, '',
str_replace('www.', '', str_replace('.'.$host, '', $_SERVER['HTTP_HOST']))
);
if(!empty($subdomena)) {
Router::connect('/', array(
'controller' => 'kontroler',
'action' => 'akcja',
$subdomena
));
}
