nginx:使用基本身份验证进行自动索引

nginx:使用基本身份验证进行自动索引

我有一个正在运行的网站,其中有一个特定的目录,我在其中存储随机的东西(这听起来很不正式,事实上也是如此)。

所以,我希望在那里有某种索引来列出该目录(和子目录)的内容。autoindex会完美地工作。

然后,我真的不想让其他人浏览该索引。auth_basic可以完美地工作。

但是,我希望能够链接到该目录内的特定文件或目录(即包含索引文件,而不是自动索引) 且无需密码保护。

所以,最终的想法是有一个自动索引密码保护基本认证但其余文件和目录保持不变。

我想出了一个巧妙的解决方案这样可行:由于访问不存在的索引时会发出 HTTP 状态 403,因此我将其重定向到location启用的autoindex自定义块auth_basic

请看此处的示例:

server {
    root ...;
    index index.php index.html index.htm;
    server_name ...;
    access_log ...;
    error_log ...;

    # general site
    location / {
        try_files $uri $uri/ @rewrite;
        location ~ \.php(/|$) {
            include fastcgi.conf;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            fastcgi_param DOCUMENT_ROOT $realpath_root;
            try_files $uri $uri/;
            fastcgi_pass unix:/run/php/php-fpm-....sock;
        }
    }

    # rewrite for the general site
    /location @rewrite {
        rewrite ...;
    }

    # that specific directory
    location /directory {
        try_files $uri $uri/ =404;
        error_page 403 = @autoindex; # hack 1

        location ~ \.php(/|$) {
            # include snippets/fastcgi-php.conf;
            include fastcgi.conf;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            fastcgi_param DOCUMENT_ROOT $realpath_root;
            try_files $uri $uri/;
            fastcgi_pass unix:/run/php/php-fpm-....sock;
        }
    }
    
    # password-protected autoindices
    location @autoindex {
        autoindex on;
        autoindex_exact_size off;
        auth_basic "directory";
        auth_basic_user_file /.../.htpasswd;
    }
}

那么... 有更好的办法吗?这种破解方法是不是一个坏主意?

谢谢你!

答案1

因此,最终的想法是有一个具有自动索引的位置,该位置受基本身份验证的密码保护,但其余文件和目录保持不变。

尝试使用正则表达式location指定您需要保护的任何位置basic_auth

基于前缀location总是先检查,但最后使用检查基于正则表达式的匹配location。如果没有基于正则表达式的匹配当前请求,则将使用location最长匹配的基于前缀的匹配。location

在这里你可以做类似的事情

index index.html;

location ~ /directory(/$|$) { # http://example.com/directory, http://example.com/directory/
    autoindex on;
    autoindex_exact_size off;
    auth_basic "directory";
    auth_basic_user_file /.../.htpasswd;
}

location /directory { # http://example.com/directory/favicon.ico
    try_files $uri $uri/ =404;

    location ~ \.php(/|$) {
        # include snippets/fastcgi-php.conf;
        include fastcgi.conf;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        try_files $uri $uri/;
        fastcgi_pass unix:/run/php/php-fpm-....sock;
    }
}

使用http://example.com作为基本 URL:

  • 根据指令,任何请求都将被编辑并http://example.com/directory启用。http://example.com/directory/autoindexauth_basiclocation ~ /directory(/$|$)
  • 任何其他请求都http://example.com/directory/*将根据location /directory指令进行处理。

相关内容