I have a server configured to host multiple node.js+express apps on multiple domains through an Ngnix frontend. Everything works great, except for when calls to redirect are made from an express route:
res.redirect('/admin');
Then the client browser is redirected to http://0.0.0.0:8090
It seems like it must be an issue with the redirection headers coming out of express, but just in case it’s relevant, here’s the nginx.conf file for the domain in question:
server {
listen 0.0.0.0:80;
server_name *.example.com;
access_log /var/log/nginx_example_access.log;
error_log /var/log/nginx_example_error.log debug;
# proxy to node
location / {
proxy_pass http://0.0.0.0:8090/;
proxy_redirect off;
proxy_set_header Host $proxy_host;
proxy_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
Solved. I had a problem in my nginx conf file that was causing node/express to receive the wrong request-header. When a relative path is passed into
res.redirect, it pulls the Host from the incomingreqobject and sets it in the response-header.should have been
$proxy_hostis the upstream host address0.0.0.0:port$hostis the incoming request-header Hostexample.comUPDATE
As Louis Chatriot points out in the comments, newer versions of Nginx have replaced
$hostwith$http_host, which in previous versions returnsexample.com:portbut now returnsexample.com.