Wie kann ich NGINX so konfigurieren, dass es Inhalte je nach User-Agent oder Gerätetyp unterschiedlich ausliefert?
- Einführung: Konzept und Einsatzszenarien
- Erkennung des User-Agent und der Gerätekategorie
- Konfigurationsmöglichkeiten und Mechanismen
- Beispielkonfiguration: Mobile-Redirect via map und return
- Beispielkonfiguration: Unterschiedliche Document Roots
- Caching, Headers und Best Practices
- Zusammenfassung
Einführung: Konzept und Einsatzszenarien
NGINX kann Inhalte abhängig vom User-Agent oder Gerätetyp unterschiedlich ausliefern, indem es Anfragen anhand von Headern (insbesondere des User-Agent-Headers) analysiert und daraufhin unterschiedliche Konfigurationsblöcke, Weiterleitungen oder Variablen wählt. Typische Einsatzszenarien sind das Ausliefern einer Mobil- statt Desktop-Version, Redirect auf eine dedizierte Subdomain, oder das Setzen spezieller Caching-/Compression-Regeln für bestimmte Clients.
Erkennung des User-Agent und der Gerätekategorie
Die Erkennung erfolgt über reguläre Ausdrücke gegen den $http_user_agent Header. Für komplexere Gerätekategorien empfiehlt sich der Einsatz von Drittbibliotheken (z. B. ua-parser, device-detection-Module) oder das Einbinden von nginx-modules wie ngx_http_map_module zur Klassifizierung in Variablen. Eine einfache Klassifizierung kann mit map erfolgen, die anhand von Keywords (z. B. Android, iPhone, Mobile) eine Variable setzt.
Beispielkonzept: map $http_user_agent $is_mobile { default 0; "~*Mobile|Android|iPhone|iPad" 1; }
Konfigurationsmöglichkeiten und Mechanismen
Sobald eine Variable gesetzt ist, kann man mit if, try_files, rewrite, return oder unterschiedlichen location-Blöcken reagieren. Empfehlenswert ist, if sparsam zu verwenden (Gefahr von unerwartetem Verhalten), stattdessen map und separate location- bzw. server-Blöcke nutzen. Beispiele für Aktionen: interne Rewrite auf eine mobile-Datei, Proxy-Pass zu einem anderen Backend, 301-Redirect auf m.example.com oder Auswahl eines anderen Root-Ordners.
Beispielkonfiguration: Mobile-Redirect via map und return
map $http_user_agent $mobile_redirect {
default 0;
"~*Android|iPhone|Mobile" 1;
}
server {
listen 80;
server_name example.com;
if ($mobile_redirect = 1) {
return 302 https://m.example.com$request_uri;
}
root /var/www/desktop;
...
}
Dieses Muster sorgt für eine zentrale, performante Klassifikation und eine schnelle Weiterleitung ohne teure if-Konstruktionen in vielen locations.
Beispielkonfiguration: Unterschiedliche Document Roots
map $http_user_agent $is_mobile { default 0; "~*Android|iPhone|Mobile" 1; }
server {
listen 80;
server_name example.com;
root /var/www/desktop;
location / {
root /var/www/$is_mobile;
try_files $uri $uri/ =404;
}
}
Hier wird entweder /var/www/0 (Desktop) oder /var/www/1 (Mobile) genutzt; praktisch ist stattdessen aussagekräftige Namen wie mobile/ und desktop/ zu verwenden und map entsprechend zu setzen.
Caching, Headers und Best Practices
Beim variierenden Content muss das Caching beachtet werden: unterschiedliche Inhalte für unterschiedliche User-Agents können Caching-Probleme erzeugen. Setzen Sie Cache-Keys (proxy_cache_key) oder vary-Header (add_header Vary User-Agent) entsprechend, damit Caches (CDN, Browser) richtig unterscheiden. Testen Sie Erkennungsregeln gründlich, halten Sie Regexes schlank und pflegen Sie eine Whitelist/Blacklist für Bots. Vermeiden Sie if in location-Blöcken, nutzen map zur Performanceoptimierung, und erwägen externe Device-Detection-Services für hohe Genauigkeit.
Zusammenfassung
Mit map + $http_user_agent, gezielten rewrites/redirects oder unterschiedlichen root/proxy-Pass-Zielen können Sie NGINX so konfigurieren, dass es mobil/desktop oder gerätespezifisch ausliefert. Achten Sie auf korrektes Caching (Vary-Header, cache-Keys), sparen Sie mit if, und ziehen Sie externe Module oder Bibliotheken hinzu, wenn die Erkennung sehr genau sein muss.
