Nginx block access to sub directory when sub directory name is unknown

时间:2016-07-11 20:17:19

标签: nginx nginx-location

I'm trying to setup Nginx to show files in a public folder for a user. The site will have multiple users and each user has a sub directory which the name is unknown to Nginx.

Example Directory Structure:

/users/usernameHere/public
/users/usernameHere/private

I only want nginx to show files from the users public directory and deny all access to any other directories.

This is what I tried so far:

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

location ^~ /users/ {
    deny all;
}

1 个答案:

答案 0 :(得分:2)

试试这个配置

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

location /users/ {
    deny all;
}

阅读official docs以查看uri之前的修饰符之间的差异,您的第一个位置是正则表达式位置,并且应使用~*~区分大小写且不区分大小写匹配。

  

位置可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(用于不区分大小写的匹配)或“〜”修饰符(用于区分大小写的匹配)指定。

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

  

如果最长匹配前缀位置具有“^〜”修饰符,则不检查正则表达式。