![Nginx 允许/拒绝指令被忽略,php 仍然被处理](https://linux22.com/image/702588/Nginx%20%E5%85%81%E8%AE%B8%2F%E6%8B%92%E7%BB%9D%E6%8C%87%E4%BB%A4%E8%A2%AB%E5%BF%BD%E7%95%A5%EF%BC%8Cphp%20%E4%BB%8D%E7%84%B6%E8%A2%AB%E5%A4%84%E7%90%86.png)
我有一个目录(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 块被使用。
这里无法使用return
,deny
将始终返回 403 错误代码。
如果您想要另一个错误代码,我想您唯一的选择就是在 PHP 脚本中实现访问控制。
编辑:根据 Alexey 的评论更新。