RegEx VHost name and the default VHost

Hello!

VHost names with RegEx is an absolutely imazing feature of nginx. I
llllllllllllllove it! :slight_smile: But now I’ve got an issue with it.

On my VM I have a VHost templates ax-common-vhost and use it for VHsots
like
project.area.loc, so the server_name rule is:

server_name ~^(.).(.).loc$;

It works fine and has already saved much time for me. But the default
VHost
seems to get a trouble with my template. When a site, that uses it, is
active, the default VHost also is trieng to use the template.

Example:

/etc/nginx/sites-available:

default
– root /usr/share/nginx/html
– server_name localhost;
test.sandbox.loc
– include /etc/nginx/sites-available/ax-common-vhost;
ax-common-vhost
– server_name ~^(.).(.).loc$;
– if ($host ~ ^(.).(.).loc$) {
set $project $1;
set $area $2;

    set $folder "$area/$project";
    set $domain "$project.$area.loc";
}

– root /var/www/$folder/;
– test.sandbox.loc (based on the ax-common-vhost)

/etc/nginx/sites-enabled:

default
test.sandbox.loc

By access to the server default VHost (over IP of the VM) an error
occures:

2013/01/23 18:41:19 [error] 4051#0: 1 directory index of “/var/www//”
is
forbidden, client: 192.168.56.1, server: ~^(.
).(.*).loc$, request:
“GET /
HTTP/1.1”, host: “192.168.56.101”

When I change the server root rule in the template e.g. to /var/www/ and
place a test file (index.html) into my webroot folder, it is displayed.

That means: Nginx uses my template for the default host. But
“192.168.56.101” cannot be mached to “^(.).(.).loc$”! Is it a bug?

Posted at Nginx Forum:

On Wednesday 23 January 2013 22:37:08 automatix wrote:

It works fine and has already saved much time for me. But the default VHost

test.sandbox.loc

– include /etc/nginx/sites-available/ax-common-vhost;

ax-common-vhost

– server_name ~^(.).(.).loc$;
– if ($host ~ ^(.).(.).loc$) {
set $project $1;
set $area $2;

This is ugly equivalent to: server_name
~^(?.+).(?.+).loc$;

    set $folder "$area/$project";
    set $domain "$project.$area.loc";

And the $domain variable is effectively equal to $host. What’s the
point?

}

– root /var/www/$folder/;

root /var/www/$area/$project;

/ HTTP/1.1", host: “192.168.56.101”

When I change the server root rule in the template e.g. to /var/www/ and
place a test file (index.html) into my webroot folder, it is displayed.

That means: Nginx uses my template for the default host. But
“192.168.56.101” cannot be mached to “^(.).(.).loc$”! Is it a bug?

Are you sure that your “default” is actually the default server
configuration
for the listening address:port?

wbr, Valentin V. Bartenev

http://nginx.org/en/donation.html

Thank you for your reply!

server_name ~^(?.+).(?.+).loc$;
Yes, you are right, it’s the better way to extract values from a RegEx
into
vars.

Are you sure that your “default” is actually the default server
configuration for the listening address:port?
No, I’m not. How can I check it?

Ilya

Posted at Nginx Forum:

On Wednesday 23 January 2013 23:41:36 automatix wrote:

No, I’m not. How can I check it?

You should check the listen directive.

Please see this article:
http://nginx.org/en/docs/http/request_processing.html
and also the documentation: Module ngx_http_core_module

wbr, Valentin V. Bartenev

http://nginx.org/en/donation.html

On Thursday 24 January 2013 00:54:22 automatix wrote:

stored in different files?

In which order are the vhost files processed?

Actually there is no such thing like “the vhost files” in nginx.
You probably mean those files included from nginx.conf by the
“include” directive (see: Core functionality ).

Before nginx 1.3.10 the order was arbitrary. Since version
1.3.10 they sorted alphabetically on unix systems.

Please note, such directories like “sites-enabled” and
“sites-available” are not something common for nginx.
In fact, they created by nginx package on some linux systems
because the maintainers of these packages find it convenient.

wbr, Valentin V. Bartenev

http://nginx.org/en/donation.html

Thank you very much for the usefull links and the tip. Yes, the vhost
default was not default. Now I’ve set it to default explicitly with the
flaf
default_server and everything works fine!

Thank you, Valentin!

Since “default server is the first one”
(How nginx processes a request), the problem
must
have been, that the server couldn’t find a vhost for the request and
just
took the first vhost. But what ist “the first” vhost, when all vhosts
are
stored in different files? In which order are the vhost files processed?

Posted at Nginx Forum:

such directories like “sites-enabled” and
“sites-available” are not something common for nginx.
In fact, they created by nginx package on some linux systems
because the maintainers of these packages find it convenient.

Good to know, thanks for the info!

Actually there is no such thing like “the vhost files” in nginx.
You probably mean those files included from nginx.conf by the
“include” directive (see: Core functionality ).

I mean the files in “sites-available”. I know, that they are just
included
(over the links in “sites-enabled”) to the nginx.conf, but I find it
clearer
and better maintainable to use one file for each vhost.

OK, now everything is clear. Thanks a lot for your help! :slight_smile:

Posted at Nginx Forum: