【问题标题】:nginx simple deny rule not enforced未强制执行 nginx 简单拒绝规则
【发布时间】:2021-05-19 17:09:04
【问题描述】:

我有点不好意思用这么简单的问题打扰你,但我不明白为什么 nginx 的配置没有对子文件夹执行简单的拒绝规则,真的希望你能把我推到明显的错误。

所以,设置:我运行了一个 nginx 网络服务器,/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/ 的子文件夹的访问,我首先将其添加到拒绝块中,如下所示:

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

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

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

尝试使用和不使用斜杠,使用和不使用 ~ 就像在 /doc/ 中一样,以及将拒绝位置块放在任何其他位置之前,现在我不知所措。仍授予对 /my/data 和所有子文件夹和文件的访问权限。谁能帮帮我?

感谢阅读!

【问题讨论】:

    标签: .htaccess nginx


    【解决方案1】:

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

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

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

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

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

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

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

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

    同样重要的是要注意,在测试时,您不应依赖浏览器。由于缓存,使用浏览器进行测试通常会导致令人困惑的结果。最好使用curl

    【讨论】:

    • 感谢您的帮助!我清理了整个配置文件并重新排序了位置。最后,我使用了^~ 修饰符,一切正常。谢谢你的帮助!!
    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2021-12-22
    • 2019-10-30
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多