Назад | Перейти на главную страницу

Перенаправление 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 добавляет временную метку, которая изменяется для каждого файла.

Это не идеально, и было бы гораздо лучше иметь чистый рабочий процесс вместо этого. Но из любопытства это может быть полезно для людей, которые задаются вопросом, возможно ли это.

Да, это так, используя комбинацию 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;
    }

}