HTTP directory redirect not using $host

Bob Ippolito bob at redivi.com
Wed Sep 20 03:09:56 MSD 2006


On 9/19/06, Igor Sysoev <is at rambler-co.ru> wrote:
> On Tue, 19 Sep 2006, Bob Ippolito wrote:
>
> > It seems that the redirection from http://example.com/somedir to
> > http://example.com/somedir/ does a 302 using the local hostname rather
> > than the Host header.
> >
> > I was able to work around the issue using rewrite:
> > if (-d $request_filename) { rewrite ^(.*[^/])$ http://$host$1/; }
> >
> > It would be nice if this was fixed in a future release. I looked
> > around in the source for a bit, but I wasn't able to find exactly what
> > needs to be changed.
>
> Had you set "server_name" ?
>
>      server {
>          server_name   example.com www.example.com;
>          ...
>      }
>
>      server {
>          server_name   example1.com www.example1.com;
>          ...
>      }
>
> nginx uses first name of the "server_name" directive in redirect.
> If server_name is not set, then it uses local hostname.

In this case, I did not set any server_name. Why not use the Host
header always, and default to server_name only if the client didn't
send one? You should really have to explicitly redirect to a different
host, the implicit redirections should simply work with the Host they
were given by the client.

> If you have an wildcard server you can force nginx to use always
> the "Host" header in redirects using "*":
>
>      server {
>          server_name   example.com  *;
>          ...
>      }
>
> The "*" could not be first name. You need to set something,
> it may be even dummy name "_":
>
>          server_name   _  *;

That should work. The wiki should probably be updated to say that * is
a valid name, as long as it's not the first one. It currently implies
that * can only be used to replace part of a domain, not the whole
thing :)

-bob





More information about the nginx mailing list