2016-08-23 82 views
0

如何拒绝除所有子域(通配符解决方案)和主域与nginx之外的非法主机头?在下面使用此代码时,所有子域都停止工作。nginx域正则表达式包含通配符

if ($host !~* ^(domain.com|*.domain.com)$) { 
    return 444; 
} 

我的服务器名是:

server_name domain.com *.domain.com; 

这又如何实现呢?

+0

'^'表示“串开始”。 '^ domain.com'不会匹配'foo.domain.com',因为'domain.com'不在字符串的开头。 '| * .'也不起作用。 '*'是“零个或多个前一个”,但是您没有以前的'|'不是匹配的字符,它是“或”的正则表达式。 –

回答

1

看看这对你的作品:

if ($host !~* ^(.+\.)?domain\.com$) { 
    return 444; 
} 

你需要躲避期,否则会被解释为“任何字符”。您还可以通过在“domain.com”之前匹配可选的子域前缀来简化正则表达式。

+0

完美运作。谢谢Trey! – Urdro

0

一个清洁的解决方案是创建一个单独的(默认)为“其他”的服务器名称server块:

server { 
    server_name .domain.com; # shorter form for "domain.com *.domain.com" 

    ... # your main config here 
} 

server { 
    listen *:80 default_server; 
    server_name ""; 

    return 444; 
}