NGINX 阻止访问文件夹不起作用

NGINX 阻止访问文件夹不起作用

我想阻止对特定文件夹的访问。

www.example.com/user/login

Here is my nginx vhost:

server {
        listen 80;

        root /var/www/example.com;
        index index.php;


        server_name example.com;

        access_log /var/log/nginx/access.log main;
        error_log /var/log/nginx/error.log;

        if (!-e $request_filename) {
                rewrite ^/admin/(.*)?$ /admin/index.php?a=$1 break;
                rewrite ^/(.*)$ /index.php?a=$1 last;
                break;
        }

        if ($request_uri ~ "/index.(php|html?)") {
                rewrite ^ /$1 permanent;
        }

        location / {
                try_files $uri $uri/ /index.php;
        }


        location ~*  \.(jpg|jpeg|png|gif|ico|css|js|woff)$ {
                expires 365d;
        }


location /user/login {
deny all;
        }


        location ~ (\.sql.gz|\.sql) { return 403; }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php7-fpm.sock;
#               fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
        }

}

server {
        listen 80;

        server_name  www.example.com;
        rewrite ^(.*) http://example.com$1 permanent;
}

我仍然可以访问该文件夹。(是的,我 nginx -s reload每次尝试后都会重新启动 nginx)。

代替:

location /user/login {
deny all;
        }

我还尝试了以下指令:

location = /user/login {
deny all;
        }

location ^~ /user/login {
deny all;
        }

但它们都没有阻止对该文件夹的访问。

有人能帮忙发现这个问题吗?

答案1

替换此块

if (!-e $request_filename) {
    rewrite ^/admin/(.*)?$ /admin/index.php?a=$1 break;
    rewrite ^/(.*)$ /index.php?a=$1 last;
    break;
}

和这个块

location / {
    try_files $uri $uri/ /index.php;
}

location ~ /(?<path>.*)$ {
    index index.php;
    try_files $uri $uri/ /index.php?a=$path;
}

location ~ /admin/(?<path>.*)$ {
    index index.php;
    try_files $uri $uri/ /admin/index.php?a=$path;
}

try_files是nginx原生实现前端控制器模式的方式,这两个块的功能和块中的语句location一样。rewriteif

此外,它们解决了您遇到的问题,因为 nginx 通常的location匹配顺序不会受到该if条件的干扰。

答案2

您的问题出在您的 nginx 配置的以下部分:

if (!-e $request_filename) {
                rewrite ^/admin/(.*)?$ /admin/index.php?a=$1 break;
                rewrite ^/(.*)$ /index.php?a=$1 last;
                break;
}

因为这个条件在你访问example.com/user/loginnginx 时为真,输入的是 if 块内的语句,而不是块内的语句location /user/login

因此,为了解决您的问题,请完全删除此 if 语句或将其放入另一个位置块中。

相关内容