PHP本身不创建虚拟目录,它只是执行脚本;虚拟目录由Web服务器(Apache/Nginx/IIS)配置实现,核心是安全路由请求至指定物理路径并严格控制PHP运行上下文。

PHP 本身不创建虚拟目录,它只是执行脚本;虚拟目录是 Web 服务器(Apache/Nginx/IIS)的配置行为。生产环境部署时,关键不是“让 PHP 支持虚拟目录”,而是确保 Web 服务器安全、稳定、可维护地将请求路由到指定物理路径,同时 PHP 运行上下文完全受控。
明确 DocumentRoot 指向 public/ 子目录
ThinkPHP、Laravel、Symfony 等现代框架要求 Web 根必须是 public/ 目录。若把整个项目(含 app/、config/、.env)直接设为 DocumentRoot,敏感文件可能被浏览器直连下载。
- Apache:
DocumentRoot "/var/www/myapp/public"+ 对应<directory></directory>块 - Nginx:
root /var/www/myapp/public;,且fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - IIS:虚拟目录物理路径必须指向
public\,不能是项目根
权限最小化:目录可读、上传目录可写、临时目录专属
PHP 进程用户(如 www-data 或 nginx)需对运行路径有精确权限,而非粗暴 chmod 777。
-
upload_tmp_dir应设为专用路径(如/var/tmp/php81-uploads),归属 www-data,权限 750 - 上传目标目录(如
/var/www/myapp/public/uploads)设为 775,属组 www-data - 框架 runtime、log、cache 目录需确保 PHP 进程可写,但禁止 Web 直接访问(Nginx 中用 location ~ ^/(runtime|log|cache) { deny all; })
域名隔离优于子路径,禁用未授权跨域访问
生产环境优先用独立域名(app1.example.com)而非子路径(example.com/app1)。前者天然隔离,后者易引发重写冲突、静态资源路径错乱、Cookie 泄露风险。
立即学习“PHP免费学习笔记(深入)”;
- Apache VirtualHost 必须配
ServerName和ServerAlias,拒绝无 Host 头请求 - 所有
<directory></directory>块内使用Require ip 192.168.0.0/16或Require env production控制访问来源 - 禁用
Options Indexes,防止目录遍历泄露
配置验证与上线前检查清单
每次变更后必须执行验证,避免因语法错误或权限遗漏导致服务中断。
- Apache:运行
httpd -t检查配置语法,再systemctl reload apache2 - Nginx:运行
nginx -t,再systemctl reload nginx - 确认
phpinfo()中open_basedir、upload_tmp_dir、doc_root值符合预期 - 用
curl -I http://your-domain.com/robots.txt测试基础响应,再检查 PHP 脚本是否返回 200 且无警告



















