Blog

Our knowledge and experience - all for you, here, on our blog

Dynamiczne subdomeny w CakePHP

Author: Kreator, category CakePHP, 12-06-2010 (last update: 28-08-2010) For intermediate users

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:

  1. 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']))
        );
        
  2. 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
    ));
}