2015-05-08 12 views
5

Ho una configurazione simile a questo:riscrittura redirect per includere la porta utilizzata per accedere al servizio

enter image description here

Un utente che lavora con il mio ambiente di sviluppo Vagrant accede localhost:8080 sul proprio computer host, che viene inoltrato in Vagrant a NGINX in esecuzione al localhost:80 sul guest. Alcune richieste vengono inoltrate al server delle applicazioni in esecuzione allo localhost:8080 sul guest e alcuni sono file statici forniti da NGINX.

Una cosa strana accade quando accedo al mio sito. Ho una pagina di accesso che reindirizza in caso di successo e l'URL viene riscritto da http://localhost:8080/login a http://localhost:80/login.

Ecco la mia configurazione Nginx per il sito:

upstream appserver { 
    server 127.0.0.1:8080; 
} 

upstream production { 
    server www.mysite.com:443; 
} 

server { 
    listen 80 default_server; 
    server_name _; 

    client_max_body_size 20M; 

    access_log /var/log/nginx/project.access.log; 
    error_log /var/log/nginx/project.error.log; 

    index /index; 

    location ~ ^(/js/testpage.js) { 
     alias /vagrant/artifacts/www/js/testpage.js; 
    } 

    location ~ ^(/test/js/app.js) { 
     alias /vagrant/test/js/app.js; 
    } 

    location ~ /test/js/app_router.js { 
     alias /vagrant/test/js/app_router.js; 
    } 

    location ~ /test/js/app_layout_controller.js { 
     alias /vagrant/test/js/app_layout_controller.js; 
    } 

    location ~ /test/js/apps/navbar/sections/layout/navbar_layout_controller.js { 
     alias /vagrant/test/js/apps/navbar/sections/layout/navbar_layout_controller.js; 
    } 

    location ~ /test/js/apps/navbar/sections/navbar/navbar_options_view.js { 
     alias /vagrant/test/js/apps/navbar/sections/navbar/navbar_options_view.js; 
    } 

    location ~ /test/js/apps/navbar/sections/navbar_all_views.js { 
     alias /vagrant/test/js/apps/navbar/sections/navbar_all_views.js; 
    } 

    location ~ ^/test/js/apps/(.*/testpage_.*\.js)$ { 
     alias /vagrant/test/js/apps/$1; 
    } 

    location ~ ^/test/js/(.*)$ { 
     alias /vagrant/js/$1; 
    } 

    location ~ ^/build/js/(.*)$ { 
     alias /vagrant/artifacts/www/js/$1; 
    } 

    location ~ ^/build/css/(.*)$ { 
     alias /vagrant/artifacts/www/css/$1; 
    } 

    location ~ ^/(.*main.*)\.[@\-_\/\d\w]+\.(js|css)$ { 
     alias /vagrant/$1.$2; 
    } 

    location ~ ^/(css|js|fonts|favicon.ico) { 
     root /vagrant; 
    } 

    location ~ ^/receipts/js/(.*)$ { 
     alias /vagrant/receipts/js/$1; 
    } 

    location ~ ^/bower_components/(.*)$ { 
     alias /vagrant/bower_components/$1; 
    } 

    location ~ ^/login-promo/ { 
     access_log off; 
     proxy_pass https://production; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    location ~ ^/(admin|login|logout|index|build|testpage|receipts|open|reset|resetpage|privacy|change|activeUser|personPrivacyAcceptances) { 
     access_log off; 

     proxy_pass http://appserver; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
} 

non sono sicuro dove il reindirizzamento è in realtà proviene, si potrebbe venire dal backend server di app o dal front-end JavaScript. C'è un modo per assicurarmi che tutti i reindirizzamenti utilizzino la porta utilizzata dal client di accesso?


Aggiornamento: La semplice aggiunta di un link <a href="/login">login</a> alla pagina radice e cercando di navigare con quel link mi reindirizza a http://localhost:80/login piuttosto che http://localhost:8080/login.

risposta

0

Questo sembra essere stato causato da fare reindirizza sbagliato nel codice dell'applicazione.

Se si dispone di un'architettura simile come sopra e si verifica il problema, è probabile che il motivo per cui si verifica il problema sia dovuto a un ingenuo tentativo di reindirizzamento senza tenere conto dell'intestazione Host.

L'applicazione dietro nginx vede una richiesta del genere:

GET /path/to/resource 
Host: virtualinstance:8888 

Purtroppo, quando si costruisce il redirect, che fa qualcosa di stupido e ricostruisce il redirect senza prendere in considerazione l'intestazione Host, optando invece per l'host e porta che sa che sta usando. Il codice che è stato rompendo la mia reindirizzamento sembrava qualcosa di simile:

return redirect("http://" + getHostName() + "/" + getPath()) 

In primo luogo, è brutto che codifica il protocollo, ma peggio ancora che si utilizza un metodo che prende il nome host, senza riguardo per la porta. Ciò restituirebbe un reindirizzamento a http://localhost/path anziché a http://localhost:8888/path.

sviluppatori, questo è il motivo per cui si dovrebbe sempre utilizzare l'intestazione Host come fonte per il vostro redirect:

return redirect("%s://%s/%s" % (getProtocol(), getHeader("Host"), 
    getPath()) 

questo fa un redirect sano, utilizzando il protocollo originale, testo completo da Host, e il percorso.

1

Questo è probabilmente un indesiderato effetto collaterale dell'avanzata della porta nginx dell'ospite su un'altra nell'host.

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

Desactivating il reindirizzamento proxy nell'ultimo blocco posizione dovrebbe fare il trucco:

proxy_redirect off; 
+0

Risolto il mio problema con questo problema, grazie. –

0

è probabile accada a causa di port_in_redirect essere on per impostazione predefinita. Vedi: http://wiki.nginx.org/HttpCoreModule#port_in_redirect

La disattivazione potrebbe interrompere la confusione sul motivo per cui la porta viene applicata.

Da lì, è semplice impostare l'appropriato host_port o remote_port nei reindirizzamenti di pass proxy, se necessario. Osservando la tua configurazione, sembra che tu stia usando le variabili del modulo principale, sarebbe abbastanza semplice includere tali variabili.

See:

http://wiki.nginx.org/HttpCoreModule#.24remote_port http://wiki.nginx.org/HttpCoreModule#.24server_port

Problemi correlati