Nginx 目录列表 - 按 IP 地址限制

Nginx Directory Listing - Restrict by IP Address

我们有一个要求,允许来自少数服务器的目录列表,不允许来自其他 IP 地址的目录列表,并且所有 IP 地址都应该能够下载目录中的所有文件。

有人可以提供正确的 nginx 配置吗?

location / {
root /downloads;
autoindex on;
allow 1.1.1.1;
deny all;
}

如果我使用上面的配置,只有 1.1.1.1 IP 地址可以从该服务器列出目录列表并可以下载文件,但是从其他 IP 地址下载显示禁止,由于 IP 地址限制

有没有办法解决这个问题,谢谢。

更新

因为 autoindex 不喜欢使用变量或在 if 块中,这是我对你的问题的有效解决方案

geo $geoAutoIndexWhitelist {
    default             0;
    1.1.1.0/24          1;
}

server {
    ...
    root /downloads;
    autoindex off;

    location / {
        if ($geoAutoIndexWhitelist) {
        rewrite ^/(.*)$ /all_downloads/ last;
        }
        try_files $uri $uri.html $uri/ =404;
    }

    location /all_downloads/ {
        internal;
        alias /downloads;
        autoindex on;
    }
}

您可以使用 geo and map 指令的组合

geo $geoAutoIndexWhitelist {
    default        0;
    1.1.1.1/24     1;
}

map $geoAutoIndexWhitelist $allowAutoIndex {
    1              off;
    0              on;
}

location / {
    root /downloads;
    autoindex $allowAutoIndex;
}

所以发生的事情是我们告诉 autoindexallowAutoIndex map 指令中获取值,而该指令又使用 geoAutoIndexWhitelist geo 指令到 return 基于 IP 范围的值。

geoAutoIndexWhitelist 默认情况下 returns a 0 除非 IP 落在子网范围内然后它 returns a 1,可以添加更多范围但是 returned值应为 0 或 1。

allowAutoIndex 根据 0 或 1 结果查看 geoAutoIndexWhitelist 和 return 关闭与开启。

请注意这是临时的且未经测试,但应该会引导您找到解决方案。