server_name bug

MZ zuborg at advancedhosters.com
Wed Oct 22 13:20:37 MSD 2008


В вт, 21/10/2008 в 22:40 +0400, Igor Sysoev пишет:
> On Tue, Oct 21, 2008 at 09:27:40PM +0300, MZ wrote:
> 
> > Обнаружил такой баг
> > server {
> >   listen *:80;
> >   server_name example.org;
> > }
> > server {
> >   listen 1.2.3.4:80;
> >   server_name default;
> > }
> > 
> > запрос на 1.2.3.4 с Host: example.org попадает не в первый vhost а во
> > второй
> > 
> > nginx 0.6.31
> 
> Это не баг. Сначала проверяются адрес:порт, а только потом имя.
> Поскольку listen 1.2.3.4:80 описан явно, то, с точки зрения nginx'а,
> сервер, в котором он описан, является единственным приёмником таких запросов.
Поскольку присутствует *:80 то приемников для коннектов на 1.2.3.4 уже
не одна штука, а включая все виртхосты с 1.2.3.4:80 и все с *:80.

> Особенно хорошо это видно, если поставить
> 
>    listen 1.2.3.4:80 default bind;
> 
> Тогда соединение в принципе не попадёт в *:80. Так устроены сокеты.
без bind соединение попадает в *:80, но не обрабатывается первым
виртхостом - разве это не баг ?

> Если на 1.2.3.4:80 ожидаются запросы для example.org, то нужно такое:
> 
>  server {
>    listen *:80;
>    listen 1.2.3.4:80;
>    server_name example.org;
>  }
>  server {
>    listen 1.2.3.4:80;
>    server_name default;
>  }
А если запросы на example.org ожидаются на любом ипе? Разве *:80 не для
того и сделан, чтоб не перечислять все ипы ?

ЗЫ: я конечно понимаю что чинить это никто не будет, кроме тех кому
надо, - опишите хотя бы этот баг в документации, чтоб у других людей
вопросов не возникало.


More information about the nginx-ru mailing list