Nginx的文档毫不含糊地警告说, 如果是邪恶的 ,应该尽可能地避免,并且在互联网的长度和宽度上都有类似的警告。
但是,这些警告大多集中在如何在location块中performance得非常糟糕。 此外,Nginx的文档说:
如果在位置的情况下可以完成的唯一100%安全的事情是:
我的问题是: if在server块级别(而不是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中包含该位置。