2013-07-02 14 views
10

Sto usando la seguente configurazione per nginx 1.4.1:nginx e slash con delega passo

 
server { 
    listen  8000; 
    server_name correct.name.gr; 

    location /test/register { 
     proxy_set_header X-Forwarded-Host $host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_pass http://127.0.0.1; 
    } 
} 

Quello che voglio fare è quando gli utenti vist http://correct.name.gr:8000/test/register/ devono essere inoltrate al apache che gira su porta 80.

Quando visito http://correct.name.gr:8000/test/register/ Ottengo risultati corretti (index.php). Quando visito lo http://correct.name.gr:8000/test/register/asd ottengo risultati corretti (404 da apache). Quando visito lo http://correct.name.gr:8000/test/asd ottengo risultati corretti (404 da nginx). Quando visito lo http://correct.name.gr:8000/test/register123 ottengo risultati corretti (404 da apache).

Il problema è quando visito lo http://correct.name.gr:8000/test/register. Ottengo una risposta 301 e sono reindirizzato a http://localhost/test/register/ (notare la barra finale e, naturalmente, il 'localhost') !!!

Non ho eseguito altre configurazioni su nginx per inserire barre finali o qualcosa di simile. Sai qual è il problema? Voglio che il http://correct.name.gr:8000/test/register funzioni correttamente tramite proxy su apache (o se non è possibile almeno emettere un errore 404 e non un reindirizzamento all'host locale dell'utente).

Update 1: Ho provato http://correct.name.gr:8000/test/register da un computer diverso da quello con cui ho avuto il cattivo comportamento di ieri .. Beh, ha funzionato: Ho appena ricevuto una risposta 301 che mi ha segnalato il corretto http://correct.name.gr:8000/test/register/! Com'è possibile lavorare da un computer ma non dall'altro (sto usando lo stesso browser, Chrome in entrambi i computer)? Ci riproverò domani per provare da un terzo per vedere il comportamento.

Grazie!

risposta

3

La mia ipotesi è che il server upstream (apache o lo script) ha attivato un reindirizzamento all'assoluto url http://localhost/test/register/. Poiché si utilizza http://127.0.0.1 nella direttiva proxy_pass, nginx non trova una corrispondenza del nome di dominio e restituisce l'intestazione Location così com'è.

Penso che la soluzione corretta sia NON utilizzare il reindirizzamento assoluto se il reindirizzamento è a un URL interno. Questa è sempre una buona pratica.

Tuttavia, senza cambiare server upstream, esistono due soluzioni rapide.

è possibile utilizzare

proxy_pass http://localhost; 

questo vi dirà Nginx il nome di dominio del monte è localhost. Quindi nginx saprà di sostituire http://localhost per http://correct.name.gr:8000 quando troverà quella parte nell'intestazione Location da monte.

Un altro è aggiungere una riga proxy_redirect per forzare nginx a riscrivere qualsiasi intestazione di posizione con http://localhost/ in esso.

proxy_pass http://127.0.0.1; 
proxy_redirect http://localhost/ /; 

Preferisco la prima soluzione perché è più semplice. Non vi è alcun sovraccarico di ricerca DNS sull'uso di proxy_pass http://localhost; poiché nginx effettua la ricerca in anticipo all'avvio del server web.

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

1

Hai già provato a giocare con server_name_in_redirect?

Tuttavia, ho trovato domande tramite google perché eseguo lo stesso problema con la barra finale. Nginx forza 301 sullo stesso URL con una barra finale.

+0

No Non ho provato a giocare con quello ... io domani - tuttavia dare un'occhiata al l'aggiornamento pls – Serafeim

+1

solo per evitare eventuali effetti collaterali il caching del browser, avrei preferito consiglia di testare queste redirezioni con curl da una shell: "curl -IL http://correct.name.gr:8000/test/register" – vreen

+0

Sì, commento molto carino ... Curl FTW! – Serafeim