当子目录名称未知时,Nginx 阻止访问子目录

Phe*_*yne 3 nginx nginx-location

我正在尝试设置 Nginx 来为用户显示公共文件夹中的文件。该站点将有多个用户,每个用户都有一个 Nginx 不知道其名称的子目录。

目录结构示例:

/users/usernameHere/public
/users/usernameHere/private
Run Code Online (Sandbox Code Playgroud)

我只希望 nginx 显示用户公共目录中的文件并拒绝对任何其他目录的所有访问。

这是我到目前为止所尝试的:

location ^~ /users/*/public/ {
    allow all;
    try_files $uri $uri/ =404;
}

location ^~ /users/ {
    deny all;
}
Run Code Online (Sandbox Code Playgroud)

Lut*_*ion 5

试试这个配置

\n\n
location ~ /users/.*/public/ {\n    allow all;\n    try_files $uri $uri/ =404;\n}\n\nlocation /users/ {\n    deny all;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

阅读官方文档以了解 uri 之前的修饰符之间的区别,您的第一个位置是正则表达式位置,应该使用~or*~来区分大小写和不区分大小写的匹配。

\n\n
\n

位置可以由前缀字符串或正则表达式定义。正则表达式使用前面的 \xe2\x80\x9c~*\xe2\x80\x9d 修饰符(对于不区分大小写的匹配)或 \xe2\x80\x9c~\xe2\x80\x9d 修饰符(对于大小写-敏感匹配)。

\n
\n\n

那么你的第二个位置是由前缀字符串定义的公共位置/users/,你使用的修饰符^~意味着跳过正则表达式检查并使用当前最长的匹配前缀,这是一个/users/,所以根据你的配置,你将始终得到 403 返回。

\n\n
\n

如果最长匹配前缀位置具有 \xe2\x80\x9c^~\xe2\x80\x9d 修饰符,则不会检查正则表达式。

\n
\n