2016-08-23 81 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; 
}