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;
}
}
A reverse proxy resides in front of one or more Web servers and shields the origin server from client requests. Often, a reverse proxy cache is a front-end for all client requests to a server. An administrator assigns a reverse proxy cache to a specific origin server.
Nginx is an open source web server that can also serve as a reverse proxy. Apart from being used to host websites, it's also one of the most widely used reverse proxy and load balancing solutions.
Reverse proxy is a proxy server which retrieve resources on behalf of client from one or more servers. Client end need not to know about all those servers. They request to proxy server on specific URL with over HTTP and proxy server finds out where to look ( in Servers ) to serve that request.
Redirect HTTP to HTTPS version for Specified domain in NginxServer_name domain-name.com www.domain-name.com – it specifies the domain names. So, replace it with your website domain name that you want to redirect. Return 301 https://domain-name.com$request_uri – it moves the traffic to the HTTPS version of the site.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With