web-dev-qa-db-ja.com

Nginx 302リダイレクト-内部で解決

現在、一部のコンテンツを提供する302リダイレクトを実装するサーバーがあります。たとえば、ユーザーのリクエスト:

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

そして、このサーバーは302で応答し、以下を提供します。

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

これは私たちにとって問題であり、Nginxにこれを処理させてよりユーザーフレンドリーにし、302リダイレクトを処理しない一部のプレーヤーと連携させたいと考えています。

私たちが欲しいのは:

  1. ユーザーリクエストhttp://frontend.example.com/hls/jet480.mp4.m3u8で、nginxが受け取りました。

  2. Nginxがhttp://Origin1.example.com/m3ugen/segsrc/jet480.mp4にリクエストを送信

  3. Nginxはリダイレクトコード302 http://Origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8を受信します

  4. Nginxはhttp://Origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8にリクエストを送信し、302リダイレクトなしでユーザーに直接応答を提供します。

これはNginxで実行できると思いますが、それについてはあまり経験がありません。どんな助けでも大歓迎です。

P.D.オリジンサーバーを構成できません。 Helix Serverを使用し、m3u8プレイリストを提供するときに、ファイルごとに変化するタイムスタンプを追加します。

7
Dakser

これは理想的ではなく、これを実行する代わりにクリーンなワークフローを作成する方がはるかに良いでしょう。しかし、好奇心から、これは可能かどうか疑問に思う人々にとって有益かもしれません。

はい、そうです、_error_page_、rewritemap、_proxy_intercept_errors_および_proxy_redirect_ディレクティブと_$upstream_http_ varパターン。

Nginxが駆動するように設計されているパスから遠く離れていることに注意してください。

_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;
    }

}
_
11
Xavier Lucas