Automatisch gegenereerde subdomeinen in Drupal

Blog
Publicatiedatum:

Enkele weken geleden is de nieuwe versie van MijnStadMijnDorp.nl gelanceerd. Dit is een multimediaal platform waar historische verenigingen uit Overijssel hun collecties tentoon stellen. In opdracht van Historisch Centrum Overijssel heeft LimoenGroen een volledig nieuwe versie ontwikkeld van deze website.

Eén van de uitdagingen van het project was om een uitgesproken persoonlijke uitstraling te geven aan de verschillende verenigingen binnen de website; iedere historische vereniging heeft een eigen homepage met titel, logo en een collage met uitgelicht werk. Het gebruik van subdomeinen (subdomein.voorbeeld.nl) heeft ons geholpen dit doel te realiseren. In dit artikel bespreken we onze bevindingen.

MijnStadMijnDorp Subdomains

De Subdomain-module

De kernfunctionaliteit werd geleverd door de contrib module Subdomain. Kort samengevat kan deze module ingesteld worden om een uniek subdomein te gebruiken voor page callbacks gerelateerd aan een specifieke gebruiker, taxonomieterm, organic group of content type.

In het geval van MijnStadMijnDorp.nl is gekozen voor de organic group modus. Iedere vereniging is een organic group en heeft een subdomein nodig. Alle content van een vereniging is gehuisvest binnen deze organic group en heeft hetzelfde subdomein in de URL’s. Standaard wordt de naam van het subdomein bepaald op basis van de titel van de organic group, of door handmatige invoer. We hebben dit gedrag aangepast zodat het subdomein aanvankelijk wordt ingesteld op basis van de titel van de organic group, maar nadien handmatig overschreven kan worden door gebruikers met administratieve privileges. Dit is handig voor verenigingen met lange namen; hier biedt een handmatig ingestelde afkorting uitkomst.

Automatisch instellen van subdomain na opslaan node:

/**
 * Implements hook_node_insert().
 *
 * Automatically set subdomain after node creation.
 */
function my_module_node_insert($node) {
  switch ($node->type) {
    case 'society':
      $node->subdomain = subdomain()->clean($node->title, TRUE);
      subdomain_url_outbound_cache_clear();
      // Create unique subdomain.
      subdomain()->save_record($node->nid, $node->title, TRUE);
      break;
  }
}

Dnsmasq

Bij lokaal ontwikkelen kan het testen van subdomeinen lastig zijn; een lokale hosts file ondersteunt geen wildcards. Dnsmasq biedt uitkomst. Het is een DNS resolver die als daemon lokaal draait. Dnsmasq werd zo ingesteld dat de DNS zone die gebruikt werd voor lokaal ontwikkelen (mijnstadmijndorp.dev) inclusief onderliggende child zones (subdomeinen) verwijzen naar 127.0.0.1. In ons geval wordt Apache lokaal gebruikt en is ServerAlias *.mijnstadmijndorp.dev toegevoegd aan de configuratie van de virtual host.

Voorbereidingen voor deployment

Het gebruik van dynamisch gegenereerde subdomeinen in een productieomgeving vereist specifieke configuratie van de webserver en de DNS-zone van het root-domein van de website.

Voor Apache volstond het om ServerAlias *.mijnstadmijndorp.nl toe te voegen aan de configuratie van de virtual host. Soortgelijke instellingen werden doorgevoerd op andere servers binnen onze OTAP-omgeving, met andere hostnamen.

Wanneer er gebruik gemaakt wordt van HTTPS (wat altijd een goed idee is), betekent het gebruik van dynamisch gegenereerde subdomeinen dat een wildcard SSL-certificaat vereist is. In ons geval is een public key-certificaat gebruikt met *.mijnstadmijndorp.nl als subject name.

Voor DNS is een wildcard (*.mijnstadmijndorp.nl) A-record aangemaakt.

Haken, ogen en afwegingen

Het database-schema van de Subdomain-module heeft een tekstveld voor het subdomein, met een maximum lengte van 255. RFC 1035 stelt dat de maximum lengte van een DNS-label 63 karakters is en dat dat opgetelde lengte van alle labels binnen FQDN niet meer dan 255 karakters mag zijn. De Subdomain-module checkt momenteel niet de lengte van het subdomein-label noch de opgetelde lengte van de FQDN. Dit kan resulteren in URI’s die niet resolvable zijn. We hebben een patch ingediend voor review die dit probleem oplost.

In de context van SEO zou het gebruik van subdomeinen geen negatief effect moeten hebben op de notering van de algehele website in zoekresultaten. Google heeft verkondigd dat zij subdomeinen niet anders behandelt dan subdirectories (bron). Zodoende zouden er geen penalties of split page rank moeten optreden bij ingebruikname van subdomeinen op een reeds bestaande website.  Desalniettemin wordt er op SEO-fora aangegeven dat de zoekmachine-notering van webpagina’s voor sommige gebruikers verbeterde na overschakelen van gescheiden subdomeinen naar subdirectories (bron).