不要使用if指令判断domain

原文地址

原理分析

NGINX接收到一个请求时,如果你配置了if指令用于检查每个请求的Host头, 不管请求的子域是什么,无论是www.example.com,还是example.com,都将执行该if指令进行判断。

相反,使用两个server指令,如下面的例子所示。这种方法降低了NGINX处理需求。

样例

  • 错误的实现方式:

```nginx configuration server {

server_name example.com www.example.com;

if ($host = www.example.com) {

return 301 https://example.com$request_uri;

} server_name example.com; ...

}


- 正确的实现方式:

```nginx configuration
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会存在一些问题,尽量避免。

Copyright © weiliang-ms 2021 all right reserved,powered by Gitbook本书发布时间: 2024-05-30 16:49:59

results matching ""

    No results matching ""