不要使用if指令判断server_name
解释说明
当NGINX
接收到一个请求时,如果你配置了if
指令用于检查每个请求的Host
头,
不管请求的子域是什么,无论是www.example.com
,还是example.com
,都将执行该if
指令进行判断。
相反,使用两个server
指令,如下面的例子所示。这种方法降低了NGINX
处理需求。
样例
- 错误的实现方式:
server {
server_name example.com www.example.com;
if ($host = www.example.com) {
return 301 https://example.com$request_uri;
}
server_name example.com;
...
}
- 正确的实现方式:
server {
listen 192.168.252.10:80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
# If you force your web traffic to use HTTPS:
# return 301 https://example.com$request_uri;
...
}
server {
listen 192.168.252.10:80;
server_name example.com;
...
}
其他场景
不光$server_name
指令,当判断$scheme
值时,也应该用多个server
代替if
判断如。
在某些情况下(但并非总是如此),添加一个额外的块指令比使用if
更好。
官方建议:
在location
上下文中使用if
会存在一些问题,尽量避免。
网友评论