2015-09-12 12 views
42

Sono abituato ad usare Apache con mod_proxy_html e sto cercando di ottenere qualcosa di simile con NGINX. Il caso d'uso specifico è che ho un utente amministratore in esecuzione in Tomcat sulla porta 8080 sul server il contesto radice:Come riscrivo gli URL in una risposta proxy in NGINX

http://localhost:8080/ 

ho bisogno di superficie presente sulla porta 80, ma ho altri contesti sul server Nginx in esecuzione su questo host, in modo vuole cercare di accedere a questo a:

http://localhost:80/admin/ 

Speravo che il seguente blocco super server semplice avrebbe fatto, ma non del tutto:

server { 
    listen 80; 
    server_name screenly.local.akana.com; 

    location /admin/ { 
     proxy_pass http://localhost:8080/; 
    } 
} 

ilil problema è che il contenuto restituito (html) contiene URL per gli script e informazioni di stile a cui è possibile accedere tutti nel contesto di root, quindi ho bisogno di ottenere questi URL riscritti per iniziare con/admin/anziché /.

Come si esegue questa operazione in NGINX?

risposta

55

Esistono due grandi impostazioni per il Nginx "proxy_pass" direttiva seconda se una barra finale è presente o assente:

location /some_dir/ { 
    proxy_pass http://some_server/; 
} 

o

location /some_dir/ { 
    proxy_pass http://some_server; 
} 

Con la prima, una richiesta di http://your_server/some_dir/some_subdir/some_file sarà inoltrato a http://some_server/some_subdir/some_file.

Fondamentalmente, /some_dir/ viene sostituito da / per modificare il percorso della richiesta da /some_dir/some_subdir/some_file a /some_subdir/some_file.

Con la seconda (nessuna barra finale), la stessa richiesta verrà inoltrata a http://some_server/some_dir/some_subdir/some_file.

In pratica, il percorso completo della richiesta originale viene trasmesso senza modifiche.

Quindi, nel tuo caso, sembra che dovresti solo eliminare la barra finale per ottenere quello che vuoi.

EDIT

Rileggendo la tua domanda, sembra forse ho perso che si vuole solo modificare l'output HTML.

Per questo, è possibile utilizzare la direttiva sub_filter. Qualcosa di simile ...

location /admin/ { 
    proxy_pass http://localhost:8080/; 
    sub_filter "http://your_server/" "http://your_server/admin/"; 
    sub_filter_once off; 
} 

In sostanza, la stringa che si desidera sostituire e la stringa di sostituzione

+0

Grazie, che aiuta molto.Penso che sub_filter lo farà. – IanG

+1

Sono curioso di sapere fino a che punto nginx sta già riscrivendo l'output, a meno che non debba scrivere il nome host/host nei collegamenti al minimo? Ad esempio, non dovresti "sub_filter" http: // localhost/"" http: // localhost/admin/"' – ThorSummoner

+0

Per consentire la riscrittura diversa dal mimetype 'text/html', dovevo aggiungere anche' sub_filter_types *; '. – anttikoo

5

Potrebbe anche essere necessario la seguente direttiva da impostare prima del primo "sub_filter" per backend-server con i dati compressione:

proxy_set_header Accept-Encoding ""; 

Altrimenti potrebbe non funzionare. Per il vostro esempio sarà simile:

location /admin/ { 
    proxy_pass http://localhost:8080/; 
    proxy_set_header Accept-Encoding ""; 
    sub_filter "http://your_server/" "http://your_server/admin/"; 
    sub_filter_once off; 
} 
Problemi correlati