11

Abbiamo un paio di backend seduti dietro i nostri front-end nginx.È possibile intercettare i reindirizzamenti backend 301/302 (proxy_pass) e riscrivere su un altro blocco di posizione?

E 'possibile intercettare 301/302 redirect inviati da questi backend e li hanno gestire nginx?

Stavamo thinging qualcosa da solo le linee di:

error_page 302 = @target; 

ma dubito 301/302 redirect possono essere gestiti come i 404 di etc etc ... Insomma, error_page probabilmente doesnt applica a 200, ecc codici di errore?

Quindi, per riassumere:

nostri backend rimandano 301/codici 302 una volta ogni tanto. Vorremmo che nginx li intercettasse e li riscrivessi in un altro blocco di posizione, dove potremmo fare qualsiasi numero di altre cose con loro.

Possibile?

Grazie!

risposta

10

Si potrebbe utilizzare proxy_redirect direttiva:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Nginx sarà ancora tornare 301/302 al cliente, ma proxy_redirect modificherà Location intestazione e il cliente deve effettuare una nuova richiesta all'URL indicato nella Location intestazione.

Qualcosa del genere dovrebbe fare la richiesta successiva di nuovo a nginx:

proxy_redirect http://upstream:port/ http://$http_host/;

2

sono riuscito a risolvere un caso più generico, quando una posizione redirect può essere qualsiasi URL esterno.

server { 
    ... 

    location/{ 
     proxy_pass http://backend; 
     # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar 
     #proxy_redirect//; 
     proxy_intercept_errors on; 
     error_page 301 302 307 = @handle_redirects; 
    } 

    location @handle_redirects { 
     set $saved_redirect_location '$upstream_http_location'; 
     proxy_pass $saved_redirect_location; 
    } 
} 

approccio alternativo, che è più vicino a ciò che si descrive, è coperto in risposta ServerFault a questa domanda: https://serverfault.com/questions/641070/nginx-302-redirect-resolve-internally

0

Se è necessario seguire più reindirizzamenti, modificare la soluzione di Vlad come segue:

1) Aggiungi

recursive_error_pages on; 

a location /.

2) Aggiungere

proxy_intercept_errors on; 
    error_page 301 302 307 = @handle_redirect; 

alla sezione location @handle_redirects.

Problemi correlati