网站目录禁止执行脚本,uploads目录防护
很多网站被入侵的起点,是上传目录里的图片或文档被替换成了 PHP 木马。
只要提前让 uploads 这类目录无法执行脚本,即使文件被传上来也运行不了。
本文面向零基础站长,讲清楚怎么在 Nginx 和 Apache 里禁止指定目录执行 PHP,步骤可以直接照做。
先判断你的服务器环境
动手前先确认两件事:Web 服务器是 Nginx 还是 Apache,以及网站根目录下的上传目录叫什么。
常见名称有 uploads、upload、files、attachment、data,有些程序还会按月份建子目录。
在终端执行下面命令可以快速确认:
nginx -v 2>&1
apache2 -v 2>&1 | head -n 1
ls -d /www/wwwroot/你的域名/uploads 2>/dev/null
如果你用的是宝塔面板,可以在“网站”列表里点开对应站点,查看“网站目录”和“配置文件”,路径通常是 /www/wwwroot/域名/。
在 Nginx 中禁止目录执行 PHP
Nginx 的做法是在站点配置里用 location 匹配上传目录,然后拒绝 .php 请求。
宝塔面板的操作路径是:网站 → 设置 → 配置文件,在 server { } 内加入:
location ~* ^/uploads/.*\.(php|php5|phtml|jsp|asp|aspx)$ {
deny all;
}
location ^~ /uploads/ {
location ~ \.php$ {
deny all;
}
}
保存后重载配置:
nginx -t && nginx -s reload
nginx -t 显示 syntax is ok 和 test is successful 才说明配置没问题。
如果站点有多个上传目录,把 uploads 换成实际目录名,或再加一段 location 即可。
Apache 下的 uploads 目录防护
Apache 可以用 .htaccess 文件实现,只对当前目录生效。
在 uploads 目录下新建 .htaccess,写入:
Require all denied
php_flag engine off
如果服务器不允许 .htaccess 覆盖,需要在主配置的 段里把 AllowOverride 设为 All 再重启 Apache。
修改主配置后执行:
apachectl configtest
systemctl reload apache2
容易踩坑的几个地方
大小写和路径匹配:Nginx 里 ~* 表示不区分大小写,写成 ~ 只匹配小写,攻击者可能用 .PHP 绕过。
只防了 uploads 却漏了子目录:像 uploads/2024/05/ 这种结构,location ^~ /uploads/ 能覆盖子目录,但正则写法要注意路径开头。
图片正常显示但脚本被拦:这是预期结果。
禁止执行不影响 .jpg、.png、.pdf 等静态文件访问。
宝塔面板改配置后不生效:先确认修改的是当前站点配置文件,再检查是否有 include 引入的其他文件覆盖了你的规则。
验证防护是否真正生效
在 uploads 目录下放一个测试文件 test.php,内容写:
浏览器访问 https://你的域名/uploads/test.php,如果返回 403 或直接下载文件,说明脚本已被禁止执行。
验证完记得删除测试文件。
还可以结合日志确认,Nginx 错误日志默认在 /www/wwwlogs/ 或 /var/log/nginx/,看到 access forbidden 记录就说明规则起作用了。
常见疑问
禁止执行后,网站上传功能会受影响吗?
不会。上传本身是写入文件,禁止执行只是不让这些文件被当作程序运行,图片和文档访问不受影响。
还有其他目录需要同样处理吗?
建议对 cache、temp、data、runtime 等可写目录做同样限制。原则是:只允许脚本在程序代码目录执行,可写目录一律禁止。
配置写错了导致网站打不开怎么办?
先执行 nginx -t 检查语法,报错会指出行号。宝塔面板可以在“配置文件”里回退到修改前的版本,或者用备份恢复。
网站目录禁止执行脚本不是一次性工作,新增上传目录或更换程序后要重新检查。
把 uploads 目录防护做扎实,能挡掉相当一部分上传木马带来的风险。