Wie leite ich veraltete Browser mit NGinx Map um?

8

Wir haben einen NginX-Balancing-Proxy vor unserer Webanwendung. Leider gibt es noch nicht genügend Entwicklungsressourcen, um veraltete Browser zu unterstützen :( Wir möchten Mitglieder unseres Webprojekts durch ihre Browser-Benutzeragenten-Daten wie diese ( https://www.in2circle.com/outdated ) auf eine / veraltete Seite umleiten. . Aus irgendeinem Grund , den wir nicht back-End mit User-Agent - Content - Analyse - Logik geladen werden soll. ich habe gehört , es ist einfach , mit nginx zu tun http://nginx.org/en/docs/http/ngx_http_map_module.html Wenn Jemand hat das getan. Können Sie mir bitte mit Beispielen und Erklärungen helfen?

Alexander Arutinyants
quelle

Antworten:

15

Die nächste Lösung funktioniert ziemlich gut und ist genau das, was ich wollte:

map $http_user_agent $outdated {
    default                                 0;
    "~MSIE [1-9]\."                         1;
    "~Mozilla.*Firefox/[1-9]\."             1;
    "~Mozilla.*Firefox/[0-2][0-9]\."        1;
    "~Mozilla.*Firefox/3[0-1]\."            1;
    "~Opera.*Version/[0-9]\."               1;
    "~Opera.*Version/[0-1][0-9]\."          1;
    "~Opera.*Version/2[0-1]\."              1;
    "~AppleWebKit.*Version/[0-6]\..*Safari" 1;
    "~Chrome/[0-9]\."                       1;
    "~Chrome/[0-2][0-9]\."                  1;
    "~Chrome/3[0-3]\."                      1;
}

if ($outdated = 1){
    rewrite ^ /outdated redirect;
}

Vielen Dank an alle für Hilfe / Antworten.

Alexander Arutinyants
quelle
Nachdem ich mit dem Modul ngx_http_browser_module von nginx mit den Variablen old_browser und modern_browser zu kämpfen hatte, stellte ich fest, dass diese Lösung tatsächlich am besten funktioniert. Das einzige Problem, das ich jetzt habe, ist, dass das if ($ veraltete ...) Umschreiben in einen Server {} -Block eingefügt werden muss, während ich es für alle virtuellen Server, die unter nginx ausgeführt werden, global machen möchte.
delatbabel
Die Map-Deklaration selbst kann im http {} -Block definiert werden. Dies ist die if-Direktive, die sowohl im Server- oder Standortkontext als auch im Standort selbst verwendet werden muss. Daher sehe ich leider keine Möglichkeit, Rewrite für Speicherorte außerhalb des Servers zu verwenden. Trotzdem können und sollten Sie den Map-Teil in den http-Bereich Ihrer Konfiguration einfügen ( zumindest laut Dokumentation habe ich ihn nicht getestet).
Alexander Arutinyants
Ich hoffe jedoch, dass Sie versuchen können, die if-Anweisung in eine separate Datei zu stellen und sie mithilfe der include-Direktive in jede Serverkonfiguration aufzunehmen.
Alexander Arutinyants
Ja, es wäre sicherlich möglich, die if-Anweisung in einer separaten Datei abzulegen, obwohl das Ändern von 3 Zeilen der if-Anweisung in eine Zeile der include-Anweisung und das Hinzufügen einer 3-zeiligen include-Datei nicht viel spart.
delatbabel
Sie haben definitiv Recht, @delatbabel. Leider habe ich noch keine Ahnung, wie ich es besser machen kann.
Alexander Arutinyants
5

Ein einfacher Test ist ausreichend:

location / {
  if ($http_user_agent ~ "MSIE 6.0" ) {
    set $browser-version outdated;
  }

  if ($http_user_agent ~ "MSIE 7.0" ) {
    set $browser-version outdated;
  }

 if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
    set $browser-version mobile;
  }

  if ( $uri ~ ^/(images|favicon\.ico) ) {
    set $browser-version independent;
  }

  if ($browser-version = outdated) {
    rewrite  ^  /outdated/index.html break;
  }

  if ($browser-version = mobile) {
    rewrite  ^  /mobile/index.html break;
  }
}
HBruijn
quelle
Es ist eine schöne und wirklich einfache Lösung. Das Problem ist jedoch, dass wir das Brouser-Outbatet zählen müssen, wenn es sich um Folgendes handelt: IE: älter als 2 Versionen (> = 11-2 für heute) Safari: älter als 2 Versionen Chrome: älter als 5 Versionen Firefox: älter als 3 Versionen Opera: älter als 2 version Selbst wenn wir alle letzten Versionen von Brousern aufschreiben, ist es zu schwierig, so viele IFs zu schreiben.
Alexander Arutinyants