有条件地为 Nginx 根目录启用自动索引?

有条件地为 Nginx 根目录启用自动索引?

有时我需要在我的网站上添加一些简单的可浏览目录。我使用以下配置实现了这一点:

  ...
  root /var/www/example.com/file_dump;
  autoindex off;

  ...
  location / {
    try_files $uri /error.html @django;
  }

  location @django {
    ...
  }

  location ~ ^/test/.+/? {
    autoindex on;
  }

因此,如果我创建一个目录/var/www/example.com/file_dump/test/something,我将获取该地址处的文件列表example.com/test/something

我尝试使用以下配置来使其更智能:

  location / {
    if (!-d test/$uri) {
      autoindex on;
    }
    try_files $uri /error.html @django;
  }

但我遇到了以下错误:

nginx:[emerg] 这里不允许使用“autoindex”指令……

为什么 Nginx 不允许autoindex在条件语句内使用?我可以autoindex通过其他方式动态启用吗?

答案1

由于启用/禁用自动索引功能是location-only 属性,因此您唯一的方法是对启用自动索引和禁用自动索引的请求使用不同的位置。尽管某些 nginx 指令允许使用变量作为参数,但autoindex不是其中之一。

完全不清楚你想通过检查if (!-d test/$uri) { ... }语句实现什么目的。如果那意味着如果是目录$uri下的某个现有目录/var/www/example.com/file_dump/test/,这里有一个可能的解决方法:

server {
    ...
    set $is_dir loc_default;
    if (-d $document_root$uri) { set $is_dir loc_index; }
    set $loc loc_default;
    if ($uri ~ ^/test/.) { set $loc $is_dir; }

    location / {
        try_files /dev/null @$loc;
    }
    location @loc_default {
        try_files $uri /error.html @django;
    }
    location @loc_index {
        autoindex on;
        # try_files $uri $uri/ =404 is assumed by default
    }
    location @django {
        ...
    }
}

$uri但是,仅使用以下方式来检查目录是否存在是毫无意义的:

    set $loc loc_default;
    if ($uri ~ ^/test/.) { set $loc loc_index; }

会给你同样的行为。

使用块可以实现同样的事情map

map $uri $loc {
    ~^/test/.    loc_index;
    # you can check multiply patterns here, for example
    ~^/another/  loc_index;
    # if none matched
    default      loc_default;
}
server {
    ...
    location / {
        try_files /dev/null @$loc;
    }
    location @loc_default {
        try_files $uri /error.html @django;
    }
    location @loc_index {
        autoindex on;
        # try_files $uri $uri/ =404 is assumed by default
    }
    location @django {
        ...
    }
}

这个try_files /dev/null <named_location>技巧来自于非常好的答案。

相关内容