目前,我们有一个服务器实现了 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 重定向的播放器一起工作。
我们想要的是:
用户请求
http://frontend.example.com/hls/jet480.mp4.m3u8
并被nginx接收。Nginx 发出请求
http://origin1.example.com/m3ugen/segsrc/jet480.mp4
Nginx 接收重定向代码 302
http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8
http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8
Nginx直接向用户发出请求并提供响应,无需任何 302 重定向。
我认为这可以用 Nginx 来实现,但我们对此没有太多经验。任何帮助都将不胜感激。
PD 我们无法配置原始服务器。它使用 Helix Server,当提供 m3u8 播放列表时,它会添加一个随每个文件而变化的时间戳。
答案1
这不是理想的做法,最好有一个干净的工作流程来代替这样做。但出于好奇,这可能会给那些想知道这是否可能的人提供信息。
是的error_page
,使用、rewrite
、map
和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;
}
}