Nginx 允许/拒绝指令被忽略,php 仍然被处理

Nginx 允许/拒绝指令被忽略,php 仍然被处理

我有一个目录(www/nginx/website1/private),我不希望通过 Web 浏览器访问,但依赖该目录内容的 php 应用程序必须可以访问。

我已经尝试了所有能想到的方法,并且在这里读到了类似的问题;但我尝试过的所有方法都没有起作用。

我努力了:

location /private/ {
allow 127.0.0.1;
deny all;
return 404; # do not want to acknowledge existence of files. return 404
}

它不起作用。如果我直接导​​航到 php 文件,它将处理该 php 文件——我已通过向 php 文件添加 echo 命令来确认这一点。

这是我当前的 nginx.conf 文件(没有任何失败的尝试)。我需要添加什么(以及在哪里)才能以上述方式阻止访问?

非常感谢!

user www;
worker_processes  4;
error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
     # Set size for max uploaded content
        client_max_body_size 0; #max size disabled
        client_header_timeout 30m;
        client_body_timeout 30m;
        access_log /var/log/nginx/access.log;
        ## Block spammers ##
        include blockips.conf;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name REDACTED;
        root /usr/local/www/nginx;
        index index.php index.html index.htm;

         listen              443 ssl;
         server_name    REDACTED
    ssl_certificate     REDACTED;
    ssl_certificate_key  REDACTED;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

### case insensitive http user agent blocking  ###
if ($http_user_agent ~*
(Googlebot|AdsBot-Google|Googlebot-images|msnbot|Bingbot|AltaVista|archive|archive.is|Slurp)
) {
    return 403;
}

## Only allow these request methods ##
     if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 444;
     }
## Do not accept DELETE, SEARCH and other methods ##

        location / {
            try_files $uri $uri/ =404;
        }

        error_page      500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                include fastcgi_params;
        }
    }
}

答案1

根据location指令文档告诉我们,在尝试前缀匹配之后会匹配正则表达式,并且在这种情况下正则表达式匹配会获胜。

为了防止这种行为,必须^~location块中使用修饰符。

因此,你的阻止规则应如下所示:

location ^~ /private/ {
    allow 127.0.0.1;
    deny all;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
}

我们还需要在这里复制 PHP 处理块,因为^~修饰符阻止了主 PHP 块被使用。

这里无法使用returndeny将始终返回 403 错误代码。

如果您想要另一个错误代码,我想您唯一的选择就是在 PHP 脚本中实现访问控制。

编辑:根据 Alexey 的评论更新。

相关内容