Nginx 文档毫不含糊地警告说if 是邪恶的,应该尽可能避免,并且在互联网的长度和广度上散布着类似的警告。
然而,这些警告中的大多数都特别关注块中的if
行为有多糟糕location
。此外,Nginx 文档说:
如果在位置上下文中,可以在内部完成的唯一 100% 安全的事情是:
返回 ...;
重写……最后;
我的问题是:如果其中包含的唯一指令是 a,那么在块if
级别server
(而不是location
块)使用 an 是否安全return
?例如,以下 www-to-non-www 重定向:
server {
listen 80;
server_name example.com www.example.com;
if ($http_host != example.com) {
return 301 http://example.com$request_uri;
}
# more config
}
Run Code Online (Sandbox Code Playgroud)
次要问题:我知道做这种事情的推荐方法是使用两个server
具有不同值的块server_name
。如果这是一个可以接受的用途if
,是否有任何理由仍然使用两个单独的server
块?
nginx 收到请求时的第一步是评估 HTTPHost
标头/TLS SNI 字段,并根据评估结果选择虚拟主机。
这意味着Host
标头始终会被处理。
现在,如果您指定if
重定向语句,则意味着Host
将检查标头两次,首先选择虚拟主机,然后检查条件if
。这是处理器工作量的两倍。
一个反驳的论点可能是单独服务器块的内存消耗。然而,在 nginx 进程的生命周期中,内存分配是相同的,而 header 的双重评估Host
发生在每个请求上。
归档时间: |
|
查看次数: |
5770 次 |
最近记录: |