Reputation: 10003
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;
}
}
Upvotes: 5
Views: 3014
Reputation: 10003
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 incoming req
object and sets it in the response-header.
proxy_set_header Host $proxy_host;
should have been
proxy_set_header Host $host;
$proxy_host
is the upstream host address 0.0.0.0:port
$host
is the incoming request-header Host example.com
UPDATE
As Louis Chatriot points out in the comments, newer versions of Nginx have replaced $host
with $http_host
, which in previous versions returns example.com:port
but now returns example.com
.
Upvotes: 7