Wie kann ich NGINX so konfigurieren, dass es Inhalte je nach User-Agent oder Gerätetyp unterschiedlich ausliefert?

Melden
  1. Einführung: Konzept und Einsatzszenarien
  2. Erkennung des User-Agent und der Gerätekategorie
  3. Konfigurationsmöglichkeiten und Mechanismen
  4. Beispielkonfiguration: Mobile-Redirect via map und return
  5. Beispielkonfiguration: Unterschiedliche Document Roots
  6. Caching, Headers und Best Practices
  7. 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.

0