I've noticed that there's functionality enabled in nginx by default, whereby a url request without a trailing slash for a directory which exists in the filesystem automatically has a slash added through a 301
redirect.
E.g. if the directory css
exists within my root, then requesting http://example.com/css
will result in a 301 to http://example.com/css/
.
However, I have another site where the SSL is offloaded by a load-balancer. In this case, when I request https://example.com/css
, nginx issues a 301 redirect to http://example.com/css/
, despite the fact that the HTTP_X_FORWARDED_PROTO
header is set to https
by the load balancer.
Is this an nginx bug? Or a config setting I've missed somewhere?
Nginx doesn't look for HTTP_X_FORWARDED_PROTO and it's not a bug. It's just lack of such functionality.
You should configure your frontend to adjust the location header in responses, or replace it with another nginx (since nginx itself is a great load-balancer and SSL-terminator).
Looks like the LB is doing SSL termination and nginx just gets a HTTP request. Nginx doesn't modify any of the HTTP headers it receives. You can do this using rewrite rules which checks whether HTTP_X_FORWARDED_PROTO is set or not and then accordingly rewrites the request. FYI nginx doesn't supported nested or complex "if" statements therefore you'll have to resort to the method described in the link below.
http://rosslawley.co.uk/2010/01/nginx-how-to-multiple-if-statements/