除非提供身份验证,否则 NGINX 使目录只读

NGINX make directory readonly unless authentication provided

我有一个目录public,我将在其中上传各种文件。我希望这些文件无需任何身份验证即可下载。 但是,如果提供身份验证,我还希望能够使用 WebDAV 编辑和添加新文件。有什么办法可以在同一个目录(位置)上同时执行这两种行为?

我尝试了以下技巧:

    location /public/ {
        if ($remote_user != "") {
            return 302 e;
        }
        auth_basic off;
        fancyindex off;
        dav_methods off;
    }

    location /public/e {
    }

但是,我找不到一种方法来代替 /public/e 索引 /public/

我还尝试了以下方法:

    location /public/ {
        if ($remote_user = "") {
            auth_basic off;
            fancyindex off;
            dav_methods off;
        }
    }

但是 Nginx 抱怨说我不能在 if 语句中包含这些指令。

我也试过:

    location /public/ {
        set $authenticated off;
        if ($remote_user != "") {
            set $authenticated on;
        }
        auth_basic $authenticated;
        fancyindex $authenticated;
        dav_methods $authenticated;
    }

但是Nginx说一个变量是无效的,onoff是预期的。

我还考虑过制作两个目录,publicpublic-webdav,它们被符号链接到同一个目录,并为它们分配不同的 nginx 位置,但我希望有一个更简洁的解决方案。

谢谢!

我用这个方法解决了:

location @public {
    auth_basic off;
}
location /public/ {
    if ($remote_user = "") {
        error_page 418 = @public;
        return 418;
    }
}

也就是说,为错误 418(茶壶)创建自定义处理程序并强制执行该错误。