В настоящее время у нас есть сервер, который реализует 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
Nginx делает запрос к http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8
и отправлять ответ напрямую пользователю без перенаправления 302.
Я думаю, что это можно сделать с помощью Nginx, но у нас нет большого опыта по этому поводу. Любая помощь будет очень оценена.
P.D. Мы не можем настроить исходный сервер. Он использует Helix Server и при обслуживании списка воспроизведения m3u8 добавляет временную метку, которая изменяется для каждого файла.
Это не идеально, и было бы гораздо лучше иметь чистый рабочий процесс вместо этого. Но из любопытства это может быть полезно для людей, которые задаются вопросом, возможно ли это.
Да, это так, используя комбинацию 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;
}
}