nginx简单拒绝规则未强制执行

时间:2015-08-28 21:46:48

标签: .htaccess nginx

我很难为一个简单的问题打扰你,但我无法弄清楚为什么nginx的配置没有对子文件夹强制执行一个简单的拒绝规则,并且真的希望你能把我推到明显的错误。 / p>

所以,设置:我运行了一个nginx webserver,/var/www是根目录,还有一些子文件夹。 SSL是强制执行的,因为我使用baikal CalDAV / CardDAV来自相应文档的fastcgi源设置。这是当前正在运行的配置文件:

server {

        listen 443 ssl;
        root /var/www;
        index index.html index.htm index.php;
        server_name mydomain.org;
        ssl_certificate /path/to/nginx.crt;
        ssl_certificate_key /path/to/nginx.key;

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        location ~ ^(.+\.php)(.*)$ {
                try_files $fastcgi_script_name =404;
                fastcgi_split_path_info  ^(.+\.php)(.*)$;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include         /etc/nginx/fastcgi_params;
        }

        rewrite ^/.well-known/caldav /baikal/cal.php redirect;
        rewrite ^/.well-known/carddav /baikal/card.php redirect;

        charset utf-8;
        location ~ /(\.ht|Core|Specific) {
                deny all;
                return 404;
        }

}

现在,我只想限制对名为/my/data/的子文件夹的访问,我首先在deny块中添加了这样的子文件夹:

        location ~ /(\.ht|Core|Specific|my/data/) {
                deny all;
                return 404;
        }

但这没有用,所以我定义了一个自己的位置,如:

        location ~ /my/data {
                deny all;
                return 404;
        }

尝试使用和不使用斜杠,在~中使用和不使用/doc/,以及将拒绝位置块放在任何其他位置之前,现在我不知所措。仍然可以访问/my/data以及所有子文件夹和文件。任何人都可以帮助我吗?

感谢阅读!

1 个答案:

答案 0 :(得分:1)

如果您使用具有正则表达式的位置,则位置顺序很重要,因为正则表达式给出的位置按顺序检查并且首次匹配获胜。也就是说,这样的配置:

 location ~ \.php$ { fastcgi_pass ... }
 location ~ /my/data { deny all; }

始终允许访问任何.php个文件,甚至可以匹配/my/data。要解决此问题,您必须保持正确的位置顺序,即首先保留location ~ /my/data

 location ~ \.php$ { fastcgi_pass ... }
 location ~ /my/data { deny all; }

或者,更好的是,使用^~修饰符替换前缀位置 - 在这种情况下,顺序并不重要。这也确保将使用正确的前缀匹配,并且根本不会检查正则表达式。 E.g:

 location ~ \.php$ { fastcgi_pass ... }
 location ^~ /my/data { deny all; }

有关nginx中位置匹配的详细信息,请参阅http://nginx.org/r/location

请注意,如果您使用return 404,配置中的deny all将是多余的,反之亦然。只需使用其中一个指令。

同样重要的是要注意,在测试时,您不应该依赖浏览器。使用浏览器进行测试通常会因缓存而导致混乱的结果。最好使用,例如curl