Nginx 302 重定向 - 内部解决

Dak*_*ser 8 nginx redirect

目前,我们有一个服务器,它实现了一个 302 重定向到服务器一些内容。例如,用户请求:

http://origin1.example.com/m3ugen/segsrc/jet480.mp4
Run Code Online (Sandbox Code Playgroud)

此服务器以 302 响应并提供:

http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8`
Run Code Online (Sandbox Code Playgroud)

这对我们来说是个问题,我们希望让 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. Nginxhttp://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8直接向用户发出请求并将响应提供给用户,无需任何 302 重定向。

我认为这可以用 Nginx 来完成,但我们对此没有太多经验。任何帮助将不胜感激。

PD 我们无法配置源服务器。它使用 Helix Server,当提供 m3u8 播放列表时,它会添加一个时间戳,每个文件都会发生变化。

Xav*_*cas 12

这并不理想,拥有一个干净的工作流程而不是这样做会好得多。但出于好奇,这对那些想知道它是否可能的人来说可能是有益的。

是的,它是使用的组合error_pagerewritemapproxy_intercept_errorsproxy_redirect指令和$upstream_httpVAR模式。

请记住,它与 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;
    }

}
Run Code Online (Sandbox Code Playgroud)