Redirecionamento Nginx 302 - resolver internamente

4

Atualmente, temos um servidor que implementa um redirecionamento 302 para o servidor de algum conteúdo. Por exemplo, a solicitação do usuário:

http://origin1.example.com/m3ugen/segsrc/jet480.mp4

E este servidor responde com 302 e serve:

http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8'

Isso é problemático para nós e gostaríamos de deixar o Nginx lidar com isso para ser mais amigável e trabalhar com alguns players que não lidam com o redirecionamento 302.

O que queremos é:

  1. Solicitação do usuário http://frontend.example.com/hls/jet480.mp4.m3u8 e recebida pelo nginx.

  2. O Nginx faz uma solicitação para http://origin1.example.com/m3ugen/segsrc/jet480.mp4

  3. O Nginx recebe o código de redirecionamento 302 http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8

  4. O Nginx faz uma solicitação para http://origin1.example.com/Segments/HLS_TS/segsrc/jet480.mp4-20140831-142558.m3u8 e veicula a resposta diretamente ao usuário sem qualquer redirecionamento 302.

Eu acho que isso poderia ser feito com o Nginx, mas não temos muita experiência sobre isso. Qualquer ajuda será muito apreciada.

P.D. Não podemos configurar o servidor de origem. Ele usa o Helix Server e, quando veicula a playlist m3u8, adiciona um timestamp que muda para cada arquivo.

    
por Dakser 31.10.2014 / 08:26

1 resposta

10

Isso não é ideal e seria muito melhor ter um fluxo de trabalho limpo em vez de fazer isso. Mas, por curiosidade, isso pode ser informativo para as pessoas que gostariam de saber se é possível.

Sim, é , usando uma combinação das diretivas error_page , rewrite , map , proxy_intercept_errors e proxy_redirect e $upstream_http var padrão.

Tenha em mente que está indo muito longe do caminho que o nginx foi projetado para ser usado.

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;
    }

}
    
por 31.10.2014 / 20:40