Nginx – 可以“如果”在服务器块级别安全使用?

Nginx的文档毫不含糊地警告说, 如果是邪恶的 ,应该尽可能地避免,并且在互联网的长度和宽度上都有类似的警告。

但是,这些警告大多集中在如何在location块中performance得非常糟糕。 此外,Nginx的文档说:

如果在位置的情况下可以完成的唯一100%安全的事情是:

我的问题是: ifserver块级别(而不是location块)使用if是否安全, if其中包含的唯一指令是return ? 例如,以下www到非wwwredirect:

 server { listen 80; server_name example.com www.example.com; if ($http_host != example.com) { return 301 http://example.com$request_uri; } # more config } 

第二个问题:我知道推荐的做这种事情的方法是两个server_name有不同的值的server块。 如果这一个可以接受的用法,是否有任何理由仍然使用两个独立的server块?

nginx接收请求的第一步是评估HTTP Host头/ TLS SNI字段,并根据评估结果select虚拟主机。

这意味着Host头始终处理。

现在,如果你为redirect指定了一个if语句,这意味着Host头将被检查两次,首先select虚拟主机,然后检查if条件。 这是处理器工作的两倍。

反参数可能是单独服务器块的内存消耗。 但是,内存分配在nginx进程的生命周期中是相同的,而Host头的双重评估发生在每个请求上。

可以做到,但是不build议。 对此已经有官方的解释 。

为了运行多个站点,我build议为每个站点创build多个configuration文件,然后在主要的nginx.conf中包含该位置。