2015-11-04 18 views
10

Come può essere configurato un reindirizzamento in nginx per rispondere a un determinato URL con un reindirizzamento relativo a un percorso specifico?come emettere un url relativo redirect da nginx?

Il nginx documentation suggerisce che questa è la modalità predefinita per nginx, ma in realtà se la posizione da reindirizzare inizia con un/nginx risponde con un URL assoluto nel campo Posizione.

per la configurazione del server locale che contiene posizioni:

location = /a { 
    return 301 some/path; 
} 
location = /b { 
    return 301 /qwerty; 
} 

la risposta posizione a una richiesta di/a è:

Location: some/path 

e per/b è:

Location: http://127.0.0.1/qwerty 

tuttavia, vorremmo/b rispondere con:

Location: /qwerty 

Il motivo per cui vorremmo utilizzare i reindirizzamenti relativi è che vorremmo accedere a nginx da diversi domini e proxy, ad es. in chiaro in dev o tramite load balancer con terminazione di ssl, e preferiremmo mantenere le cose semplici sollevando nginx dal dover capire quel contesto.

proposito questi esempi sono stati testati contro versioni nginx 1.4.6 e 1.9.6, utilizzando arricciatura es .:

curl --head http://127.0.0.1/b 

risposta

4

nginx filtro intestazione inserisce sempre <scheme>://<host> se return URI inizia con /.
(vedi ngx_http_script_return_code() e ngx_http_header_filter() funzione nella fonte nginx per riferimento)


Quindi, se il cliente (ad esempio, Google Chrome) può accettare Location: /qwerty, è possibile utilizzare la seguente configurazione:

location = /b { 
    return 301 " /qwerty"; # insert space char before "/qwerty" 
} 

Un'altra soluzione può generare esattamente Location: /qwerty tramite la direttiva lua-nginx-module e add_header:

location = /b { 
    add_header Location "/qwerty"; 
    content_by_lua 'ngx.exit(301)'; 
} 

Come funziona questa configurazione strano?

  • uso ngx.exit per uscire con codice di stato con la 301, non crea "Location" intestazione (direttiva return creare sempre "Location" intestazione, anche il valore di intestazione vuoto)
  • uso add_header aggiungere Location: /qwerty intestazione, esso non inserisce <scheme>://<host>
+0

Bel trucco con uno spazio nella direttiva "ritorno". Questo comportamento di nginx è documentato ovunque? –

+0

Quel trucco spaziale è esilarante e fantastico, come l'hai scoperto? –

+0

hi @TrevorFreeman, RFC 2616 consente effettivamente "ingannare lo spazio". Nel capitolo "4.2 Intestazioni dei messaggi", il valore dell'intestazione è definito come "valore-campo = * (campo-contenuto | LWS)". '* LWS' significa zero o molti' spazi bianchi lineari '. – xiaochen