目前,我们有一个服务器,实现302redirect到服务器的一些内容。 例如,用户请求:
http://origin1.example.com/m3ugen/segsrc/jet480.mp4
而这个服务器用302响应并服务于:
http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8`
这对我们来说是有问题的,我们希望让Nginx处理这个更友好的用户,并与一些不处理302redirect的玩家合作。
我们想要的是:
用户请求http://frontend.example.com/hls/jet480.mp4.m3u8并由nginx接收。
Nginx请求http://origin1.example.com/m3ugen/segsrc/jet480.mp4
Nginx接收redirect代码302 http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8
Nginx向http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8发出请求,并直接向用户提供响应,而不进行任何302redirect。
我认为这可以用Nginx来完成,但我们对此没有太多的经验。 任何帮助将非常感激。
PD我们不能configuration原始服务器。 它使用Helix服务器,当为m3u8播放列表提供服务时,它会为每个文件添加一个时间戳。
这并不理想,要有一个干净的工作stream程而不是这样做会好得多。 但是为了好奇,这可能会让人想知道是否有可能。
是的 ,使用error_page , rewrite , map , proxy_intercept_errors和proxy_redirect指令以及$upstream_http var模式的组合。
请记住,nginx的devise目的就在于此。
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; } }