Basecamp-stijl-subdomeinen met CodeIgniter

CodeIgniter is een eenvoudig en lichtgewicht PHP-framework dat wordt gebruikt om krachtige webtoepassingen te maken. Vandaag gaan we iets leuks doen: we zullen gebruikersnamen en subdomeinen combineren om een ​​meer samenhangende gebruikerservaring te creëren.

Als je een beetje in de war bent, kunnen deze gebruikers via deze functie toegang krijgen tot hun accounts door een aangepaste URL in te typen die verwijst naar hun gebruikersnaam, zoals harbinger.yourapp.com.


Overzicht

In deze zelfstudie maken we zowel een front-end weergave als een back-end applicatie-view, vergelijkbaar met de configuratie gebruikt in Basecamp, waar het bezoeken basecamphq.com toont de startpagina, maar bij het bezoeken van een subdomein wordt de inlogpagina weergegeven.

We zullen het fictieve adres gebruiken nettutsapp.com, en zal een voorbeeld van een "dashboard" -pagina maken; u zou dit echter relatief eenvoudig in een bestaand project kunnen opnemen.

Zorg voordat u begint dat u een webserver heeft waarop PHP is geïnstalleerd. Je moet ook CodeIgniter downloaden; in het voorbeeld gebruik ik CodeIgniter 2.0, maar de code zou moeten werken op 1.7.2. Dus laten we beginnen!


Stap 1: DNS-configuratie

Allereerst moeten we onze DNS-instellingen configureren om alle subdomeinen naar een enkel adres te laten verdwijnen. Als u op een live server werkt, moet u uw DNS-instellingen wijzigen met het bedrijf dat uw DNS beheert. Dit is meestal uw webhost of domeinregistreerder.

Het kost te veel tijd om elke configuratie in deze zelfstudie af te dekken. Vraag in plaats daarvan uw host om hulp bij het instellen van wildcard-subdomeinen. Je zou verwachten iets van de onderstaande regel toe te voegen aan je DNS-configuratie.

* .Nettutsappapp.com. IN A 91.32.913.343

Als u daarentegen op een lokale server werkt, is het toevoegen van een subdomein met jokertekens aan het hosts-bestand vrij lastig. Wat ik het liefst doe is het toevoegen van afzonderlijke items voor testdoeleinden. Deze kunnen worden verwijderd nadat u klaar bent. Voor ons domein moeten we vier items als volgt toevoegen:

  • 127.0.0.1 nettutsapp.com
  • 127.0.0.1 gebruiker1.nettutsapp.com
  • 127.0.0.1 gebruiker2.nettutsapp.com
  • 127.0.0.1 gebruiker3.nettutsapp.com

Mac Hosts-configuratie

Om dit op een Mac te doen, opent u Terminal en typt u sudo nano / etc / hosts. Gebruik de pijltjestoetsen om naar de onderkant van het document te gaan en voeg de gegevens toe aan de onderkant van het bestand. Als u klaar bent, drukt u op Ctrl + X en Y om het opslaan te bevestigen.

Windows Hosts-configuratie

Als u Windows gebruikt, bladert u naar de map C: \ Program Files \ system32 \ drivers \ etc en open het hosts-bestand in Kladblok of de teksteditor van uw voorkeur. Voeg vier items toe, hierboven weergegeven en sla het bestand op.

Als u DNS-wijzigingen hebt aangebracht op een live server, duurt het even voordat u enig effect merkt. Als u wijzigingen aanbracht in uw hosts-bestand, zijn de wijzigingen onmiddellijk.


Stap 2: Apache-configuratie

Het doel is hier om twee virtuele hosts in te stellen in de Apache-configuratie: één voor de voorpagina (Basecamp-homepage) en de andere voor weergave van de pagina wanneer deze via een subdomein wordt geopend (dashboardpagina).

Om nieuwe items toe te voegen, moet u de. Openen httpd.conf bestand, dat te vinden is in de installatiemap van Apache. Het wordt vaak gevonden in de bin / apache / conf map. Afhankelijk van uw serverconfiguratie kan de locatie echter verschillen.

Eenmaal geopend, moet u de twee items toevoegen, zoals hieronder getoond. Zorg ervoor dat u de DocumentRoot naar een locatie van uw keuze, die u hebt gemaakt.

Notitie: Onthoud het jokerteken en het andere mappad op de tweede VirtualHost.

WAMP-gebruikers: Ik raad aan te lezen deze post, die beschrijft hoe VirtualHosts moet worden opgezet. U kunt ook problemen ondervinden met toestemmingen; dus ik raad aan om je VirtualHost-directory's in de. te plaatsen www directory.

  DocumentRoot "/ Users / densepixel / Sites / MAMP PRO / nettutsappfront" ServerName nettutsapp.com ServerAlias ​​nettutsapp.com  Opties -Indexen Opties FollowSymLinks AllowOverride All    DocumentRoot "/ Users / densepixel / Sites / MAMP PRO / nettutsapp" ServerName nettutsapp.com ServerAlias ​​* .nettutsapp.com  Opties -Indexen Opties FollowSymLinks AllowOverride All  

Nadat u het bestand hebt opgeslagen, moet u Apache opnieuw starten om de wijzigingen door te voeren.

Zorg ervoor dat u de mappen hebt gemaakt die u hebt opgegeven in de httpd.conf bestand voordat de server wordt gestart.


Stap 4: testen van onze serverconfiguratie

Voordat we de configuratie testen, plaatst u een basis html pagina in elk van de mappen die u eerder hebt gemaakt. Voeg misschien een enkele regel tekst aan elk toe, zodat u ze kunt onderscheiden. Ik heb een voorbeeld gekopieerd dat je kunt gebruiken.

    NetTuts App Front   NetTutsApp Front  

Open vervolgens uw favoriete browser en controleer eerst het adres nettutsapp.com. Als alles werkt, zou je moeten kijken naar de pagina die je in de 'nettutsappfront'map.

Controleer vervolgens een subdomein, bijvoorbeeld. user1.nettutsapp.com; dit zou u de andere pagina moeten tonen die u in de directory hebt aangemaakt.

U kunt doorgaan met het controleren van de andere subdomeinen die u hebt opgegeven in het hosts-bestand, die allemaal de pagina moeten weergeven die in onze directory is opgeslagen.

Stap 5: CodeIgniter-installatie

Deze tutorial gaat ervan uit dat je weet hoe je CodeIgniter moet installeren. Als dat niet het geval is, bekijk dan deze video-tutorial van Jeffrey Way, waarin het proces in detail wordt uitgelegd.

Plaats de CodeIgniter-bestanden in onze directory na het verwijderen van de html pagina die we eerder hebben gemaakt. Als u CodeIgniter 1.7.2 gebruikt, wilt u misschien de toepassing map uit de systeem map.

Test de installatie door naar de URL te bladeren user1.nettutsapp.com, en u zou de welkomstpagina van CodeIgniter moeten zien.


Stap 6: CodeIgniter instellen

Stel CodeIgniter in zoals u normaal zou doen, zoals beschreven in deze tutorial. Misschien wilt u de index.php van de URL, autoload sommige bibliotheken of helpers, enz. Voor de doeleinden van deze tutorial, moeten we de autoload databank bibliotheek en de url helper. Open de autoload.php bestand in de config map en voeg de relevante vermeldingen toe.

We moeten ook de standaardcontroller wijzigen in een die we gaan maken, genaamd dashboard. Deze waarde kan worden gewijzigd binnen de /config/routes.php het dossier.

base_url

Voor de gebruikersubdomeinen moeten we de base_url variabel dynamisch, omdat de toepassing verzoeken van een aantal potentiële subdomeinen ontvangt.

De eenvoudigste manier om dit te doen is door de HTTP_HOST variabel. Open de config.php bestand en zoek de variabele $ Config [ 'base_url'], en vervang het door de volgende code:

if (isset ($ _ SERVER ['HTTPS']) && $ _SERVER ['HTTPS'] == "on") $ ssl_set = "s"; else $ ssl_set = ""; $ config ['base_url' ] = 'http'. $ ssl_set. ': //'.$_SERVER [' HTTP_HOST '];

Deze code staat voor HTTPS verbindingen, echter, als u nooit van plan bent om te gebruiken HTTPS, je kunt het vereenvoudigen base_url = $ _SERVER ['HTTP_HOST'].

Database-instellingen

Voordat we doorgaan en de database-instellingen toevoegen aan onze CodeIgniter-applicatie, moeten we zowel de database als een voorbeeldtabel maken.

Deze voorbeeldtoepassing gebruikt één database en één tabel. Deze tabel bevat alle subdomeinen die momenteel zijn toegewezen, en enkele basisinformatie over hen. Als u hebt besloten deze code te gebruiken in uw eigen toepassing, moet u over het algemeen meerdere gebruikers toewijzen aan een enkel subdomein, maar het databaseschema valt buiten het bestek van deze zelfstudie.

De tabel heeft de naam nt_subdomains, in de database ntapp, en heeft vier velden:

  • subdomain_id (primair, auto_increment)
  • subdomain_name
  • user_fname
  • user_sname

Ik heb ook de tabel gevuld met twee records, die overeenkomen met de subdomeinen die we hebben toegevoegd aan ons hosts-bestand:

Nu kunnen we de databaseconfiguratie, het gevonden bestand openen /application/config/database.php, en bewerk de volgende waarden zodat ze overeenkomen met uw persoonlijke configuratie-instellingen.

$ db ['standaard'] ['hostname'] = 'localhost'; $ db ['standaard'] ['gebruikersnaam'] = 'root'; // MAMP default $ db ['default'] ['password'] = 'root'; // MAMP default $ db ['standaard'] ['database'] = 'ntapp';

En we zijn klaar met het installeren van onze CodeIgniter-installatie. Laten we beginnen met het gebruik van de subdomeinen in onze applicatie.


Stap 7: Onze controllers en weergaven maken

Voor deze toepassing gaan we twee controllers maken. De eerste is een fout controller, die een fout weergeeft als het subdomein niet is geregistreerd voor gebruik in de toepassing. De andere controller is onze belangrijkste dashboardcontroller, wat de gebruiker ziet als het subdomein is toegevoegd aan onze database.

Foutregelaar

Laten we doorgaan en onze foutcontroller maken. Maak eerst een nieuw bestand in de / Application / controllers map en bel het error.php.
Opmerking: de naam van het bestand is belangrijk

load> view ( 'fout'); 

Voeg de bovenstaande code toe aan onze nieuwe error.php het dossier. De inhoudsopgave functie laadt een weergave genaamd 'fout', die we later zullen maken.

Dashboard-controller

Nu moeten we de hoofdcontroller voor het dashboard maken, die wordt geladen wanneer een gebruiker een van de subdomeinen binnengaat. De controller zal dan controleren of het subdomein is geregistreerd en zal zo nodig doorsturen. We zullen deze code later toevoegen, maar eerst moeten we de basiscontroller maken.

Maak een nieuw bestand binnen de controllers map en geef deze een naam dashboard.php. In dit bestand moeten we de controller maken en de dashboardweergave laden. Kopieer de onderstaande code en sla het bestand op.

load> view ( 'dashboard'); 

Foutweergave

De foutpagina wordt weergegeven wanneer een gebruiker toegang probeert te krijgen tot een subdomein dat niet is geregistreerd voor gebruik door de toepassing. Gebruik voor de zelfstudie eenvoudigweg een basispagina waarop het bericht wordt weergegeven Subdomein niet geregistreerd. Voeg de onderstaande code toe aan een nieuw bestand met de naam error.php en sla het op in de map met applicaties / weergaven.

  Toepassingsfout: Nettuts-app   

Nettuts Toepassingsfout

Subdomein niet geregistreerd

Dashboard-weergave

Voorlopig maken we alleen een eenvoudige dashboardpagina. U kunt dezelfde structuur gebruiken als de foutenweergave en deze gewoon wijzigen in lezen Nettuts-dashboard, of iets in die richting. Sla de pagina op als dashboard.php, binnen de application / x bekeken map.

Test de twee weergaven door de URL's te bezoeken:

  • user1.nettutsapp.com/index.php/error
  • user1.nettutsapp.com/index.php/dashboard

Werken? Laten we verder gaan.


Stap 8: uitbreiding van onze dashboardcontroller (deel 1)

De volgende stap is om de naam van het subdomein uit te pakken in onze controller, zodat we deze in een databasequery kunnen gebruiken.

We gaan onze subdomein controle code invoegen in de construeren functie binnen de dashboardcontroller. (Onder de ouder :: Controller ()). Dit betekent dat het subdomein wordt gecontroleerd wanneer een van de functies binnen de dashboardcontroller wordt gebruikt.

De eenvoudigste manier om de naam van het subdomein te extraheren, is door de PHP te gebruiken ontploffen functie en stel het scheidingsteken in op '.'. Omdat we alleen het eerste deel nodig hebben, kunnen we het splitsen in twee delen en vervolgens het eerste deel (de naam van het subdomein) toewijzen aan een variabele.

Om dit te testen, kunnen we echo de variabele uit in de controller zelf. Zie de onderstaande code:

 

Ga naar uw subdomein-URL's en u moet het juiste subdomein zien dat op uw pagina wordt weergegeven, zoals hieronder.
Notitie: U kunt de echo-instructie nu verwijderen.

Nu we toegang hebben tot de naam van het subdomein in onze controller, kunnen we controleren of de tabel die we eerder hebben gemaakt, is toegevoegd.

We zullen CodeIgniter's gebruiken ActiveRecord-klasse om onze query's te maken, die de tabel voor het gebruikte subdomein controleren. Als deze aanwezig is, heeft de gebruiker toegang tot de dashboardpagina. Als, aan de andere kant, het subdomein niet is ingevoerd, wordt de toegang geweigerd en vervolgens omgeleid naar de foutpagina die we eerder hebben gemaakt.

Voor deze zelfstudie zullen we geen modellen gebruiken, omdat de tutorial hierdoor veel gemakkelijker te volgen is. CodeIgniter is vrij flexibel omdat het je niet dwingt om ze te gebruiken.

Eerst moeten we de query samenstellen zoals hieronder wordt getoond. Deze code werkt alleen in PHP5, omdat hij methodieketen gebruikt; U kunt het echter naar wens aanpassen.

// voegt toe van de rest van de constructie // $ this-> db-> from ('nt_subdomains') -> where ('subdomain_name', $ subdomain_name); $ query = $ this-> db-> get ();

We kunnen de CodeIgniter-functie gebruiken rij() om te controleren of dat subdomein in de tabel voorkomt. Als dat niet het geval is, moeten we de omleidingsfunctie gebruiken om onze gebruikers om te leiden naar de foutcontroller. Het volgende deel van de code is hieronder:

// voegt toe van de vorige code // if ($ query-> num_rows () < 1)  redirect ('error'); 

Laten we dit testen door toegang te krijgen tot user1.nettutsapp.com, die je naar de dashboardpagina moet leiden. Probeer nu user3.nettutsapp.com, die u moet omleiden naar de foutpagina omdat deze niet in de tabel is ingevoerd.


Stap 9: uitbreiding van onze dashboardcontroller (deel 2)

Nu kunnen we de informatie in de tabel gebruiken om specifieke informatie voor elk subdomein weer te geven.

We zullen toevoegen aan de inhoudsopgave functie in onze dashboardcontroller. Kopieer eerst de subdomeinnaamcode en de databasequery die we eerder hebben gebruikt.

function index () $ subdomain_arr = explode ('.', $ _SERVER ['HTTP_HOST'], 2); $ subdomain_name = $ subdomain_arr [0]; $ this-> db-> from ('nt_subdomains') -> where ('subdomain_name', $ subdomain_name); $ query = $ this-> db-> get (); 

We gebruiken CodeIgniter's rij() functie om het resultaat van de query op te halen. De rij functie retourneert een enkele resultaatrij, wat betekent dat we geen a moeten gebruiken foreach lus; het is onnodig.

// voegt toe van de rest van de indexfunctie // $ subdomain_info = $ query-> row ();

Ken vervolgens de user_fname en user_sname kolomwaarden voor de rangschikking, $ data, die vervolgens wordt doorgegeven aan de uitzicht.

$ data ['fname'] = $ subdomain_info-> user_fname; $ data ['sname'] = $ subdomain_info-> user_sname; $ this-> load-> view ('dashboard', $ data);

We kunnen deze waarden gebruiken in onze weergave door de variabelen te gebruiken $ fname en $ sNAME. Open de dashboardweergave en bewerk deze om te lezen:

 

Welkom bij uw dashboard

En we zijn klaar! Laten we het testen.


Stap 10: Testen

Probeer alle URL's en hopelijk, als alles volgens plan zou verlopen, zouden de resultaten als volgt moeten zijn:

  • nettutsapp.com → Pagina voorpagina
  • user1.nettutsapp.com → Dashboard (John Doe)
  • user2.nettutsapp.com → Dashboard (Steve Smith)
  • user3.nettutsapp.com → Foutpagina

Controller en weergavecode

Dit is de volledige cote die wordt gebruikt voor onze controllers en weergaven:

Dashboard-controller

db-> from ('nt_subdomains') -> where ('subdomain_name', $ subdomain_name); $ query = $ this-> db-> get (); if ($ query-> NUM_ROWS () < 1)  redirect ('error');   function index()  $subdomain_arr = explode('.', $_SERVER['HTTP_HOST'], 2); $subdomain_name = $subdomain_arr[0]; $this->db-> from ('nt_subdomains') -> where ('subdomain_name', $ subdomain_name); $ query = $ this-> db-> get (); $ subdomain_info = $ query-> row (); $ data ['fname'] = $ subdomain_info-> user_fname; $ data ['sname'] = $ subdomain_info-> user_sname; $ this-> load-> view ('dashboard', $ data); 

Foutregelaar

load> view ( 'fout'); 

Dashboard-weergave

  Dashboard: Nettuts-app   

Nettuts-dashboard

Welkom bij uw dashboard

Foutweergave

  Toepassingsfout: Nettuts-app   

Applicatiefout

Subdomein niet geregistreerd


Conclusie

Natuurlijk beschrijft deze tutorial slechts één manier om deze handige functionaliteit te verkrijgen. Ik weet zeker dat er nog veel meer zijn; dus voel je vrij om je opmerkingen en meningen in de comments hieronder in te vullen.