Nginx 302-Umleitung - intern auflösen

7

Derzeit haben wir einen Server, der eine 302-Umleitung implementiert, um einige Inhalte zu serverieren. Zum Beispiel die Benutzeranforderung:

http://origin1.example.com/m3ugen/segsrc/jet480.mp4

Und dieser Server antwortet mit 302 und dient:

http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8`

Dies ist für uns problematisch und wir möchten, dass Nginx dies benutzerfreundlicher macht und mit einigen Spielern zusammenarbeitet, die keine 302-Umleitung verarbeiten.

Was wir wollen ist:

  1. Benutzeranfrage http://frontend.example.com/hls/jet480.mp4.m3u8und von nginx erhalten.

  2. Nginx machen Anfrage an http://origin1.example.com/m3ugen/segsrc/jet480.mp4

  3. Nginx erhält den Weiterleitungscode 302 http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8

  4. Nginx fordert http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8den Benutzer ohne Weiterleitung an und sendet die Antwort direkt an den Benutzer.

Ich denke, dass dies mit Nginx möglich ist, aber wir haben nicht viel Erfahrung damit. Jede Hilfe wird sehr geschätzt.

PD Wir können den Ursprungsserver nicht konfigurieren. Es verwendet Helix Server und fügt beim Bereitstellen der m3u8-Wiedergabeliste einen Zeitstempel hinzu, der sich für jede Datei ändert.

Dakser
quelle

Antworten:

11

Dies ist nicht ideal und es wäre weitaus besser, einen sauberen Workflow zu haben, als dies zu tun. Aber aus Neugier könnte dies für Leute informativ sein, die sich fragen würden, ob es möglich ist.

Ja , es ist eine Kombination der Verwendung von error_page, rewrite, map, proxy_intercept_errorsund proxy_redirectRichtlinien und $upstream_httpvar Muster.

Denken Sie daran, dass es weit vom Weg entfernt ist, auf dem Nginx gefahren werden soll.

map $upstream_http_location $redirect_uri {
    "~http://[^/]+/(?<location_uri>.*)$" "$location_uri";
}

upstream origin {
    server origin1.com;
}

server {

    listen 80;
    server_name nginx-front.com;

    proxy_set_header Host "origin1.com";
    proxy_redirect http://origin1.com/ /;

    location ~ ^/hls/(\w+)\.mp4\.m3u8$ {
        proxy_pass http://origin/m3ugen/segsrc/$1.mp4;
        proxy_intercept_errors on;
        error_page 301 302 = @handler;    
    }

    location @handler {
        rewrite ^ /$redirect_uri break;
        proxy_pass http://origin;
    }

}
Xavier Lucas
quelle
Hallo, vielen Dank für Ihre Hilfe! Ich habe versucht, dies zu implementieren, aber ich erhalte den Fehler "unbekannte Direktive" error_code ". Ich habe eine saubere Nginx-Installation durchgeführt, aber es hat nicht geholfen. Ich habe es mit Nginx 1.0.15 und 1.6.2 versucht. Es könnte großartig sein um zu wissen, was dies verursachen könnte. Vielen Dank im Voraus Xavier.
Dakser
@Dakser Tippfehler, ersetze error_code durch error_page.
Xavier Lucas