在phpenv中禁止上传目录执行php,需将location ~ ^/(uploads|data|config)/..(php|php5)$ { deny all; }置于location ~ \.php$块之前,修改vhost配置后执行nginx -s reload生效。

phpEnv 是 Windows 下的 PHP 集成环境,底层用的是 Nginx + PHP-FPM。它默认把网站根目录设为 www,但不会自动禁止上传目录或敏感路径下的 PHP 执行——这点必须手动补上,否则用户上传的 shell.php 一点就执行。
location ~* ^/(uploads|data|config)/.*\.(php|php5)$ 必须放在 fastcgi 处理块之前
这是最常踩的坑:phpEnv 的默认配置里,location ~ \.php$ 块通常靠前,而你新加的禁止规则如果写在它后面,Nginx 就会先匹配到 PHP 处理逻辑,根本不会走到你的 deny all 里。
- 打开
phpEnv\nginx\conf\vhost\your-site.conf(或default.conf) - 找到类似
location ~ \.php$ { ... fastcgi_pass ... }的整段 - 把你的禁止规则粘贴到这段的正上方
正确顺序示例:
location ~* ^/(uploads|data|config)/.*\.(php|php5)$ {
deny all;
return 403;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
...
}
禁止访问所有 .php 文件,但保留 index.php 可用
适合单入口框架(如 ThinkPHP、Laravel),要求除 index.php 外其他 PHP 文件一律 404 或 403。
- 用
location = /index.php精确匹配入口文件,确保它能被正常转发 - 用
location ~ \.php$匹配其余所有 PHP 请求,并直接return 404或deny all - 注意:
=的优先级高于~,所以/index.php不会被下面的规则拦截
最小可用配置:
location = /index.php {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \.php$ {
return 404;
}
phpEnv 中 uploads 目录路径容易写错
phpEnv 默认网站根目录是 phpEnv\www,但你在 Nginx 配置里写的路径是 URI 路径(即浏览器地址栏看到的路径),不是磁盘绝对路径。
- 如果用户访问
http://localhost/uploads/test.php,URI 是/uploads/test.php,匹配规则应为^/uploads/.*\.php$ - 不要写成
^/D:/phpEnv/www/uploads/.*\.php$—— Nginx location 不认磁盘路径 - 如果用了子目录部署(比如
http://localhost/myapp/uploads/),规则要改成^/myapp/uploads/.*\.php$
改完必须 reload,不能只 restart
phpEnv 自带的「重启 Nginx」按钮实际执行的是 nginx -s reload,这是对的;但有人手动去任务管理器杀进程再双击启动,这就跳过了配置热加载,改了也白改。
- 确认修改保存后,在 phpEnv 主界面点「重启 Nginx」
- 或者进
phpEnv\nginx目录,命令行执行:nginx.exe -s reload - 检查错误日志:
phpEnv\nginx\logs\error.log,如果有invalid number of arguments in "location" directive这类报错,说明正则写法有语法问题
真正起作用的永远是 Nginx 实际加载的配置,不是你编辑器里看起来“很对”的那一版。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











