PHP本身不创建虚拟目录,真正创建和管理虚拟目录的是Web服务器;所谓“PHP虚拟目录”本质是将URL路径(如/admin)映射到非根目录的物理路径,并确保PHP脚本可执行、路由可解析,关键在于处理逻辑继承、路径配置、权限设置与框架适配。

PHP 本身不创建虚拟目录,真正创建和管理虚拟目录的是 Web 服务器(如 IIS、Apache、Nginx)。所谓“PHP 虚拟目录”,本质是让 Web 服务器把某个 URL 路径(比如 /admin 或 /api)映射到服务器上一个非网站根目录的物理路径,并确保 PHP 脚本能正常执行、路由能正确解析。流程成败的关键不在“加目录”,而在“继承处理逻辑+配对路径+权限到位+框架适配”。
一、明确目标与准备条件
先确认你要达成的效果:
- 是想用
/myapp访问一个独立的 PHP 项目(如 ThinkPHP、Laravel),还是仅托管几个 PHP 工具脚本? - 物理路径是否全英文、无空格、无中文?例如
E:\www\myapp✅,E:\我的项目❌ - Web 服务器已运行 PHP,并且
php-cgi.exe(IIS/Nginx)或mod_php(Apache)工作正常;fileinfo、mbstring、openssl等扩展已启用。 - 你有服务器管理员权限(尤其涉及 IIS_IUSRS 权限、php.ini 修改、服务重启)。
二、按服务器类型实操配置
IIS(Windows + FastCGI)
- 在 IIS 管理器中右键网站 →「添加虚拟目录」→ 填写别名(如
soft)和物理路径(如E:\www\soft) - 关键一步:右键该虚拟目录 →「处理程序映射」→「添加模块映射…」
• 请求路径:*.php
• 模块:FastCgiModule(下拉选择,不可手输)
• 可执行文件:C:\php\php-cgi.exe(必须与主站一致)
• 名称:PHP_via_FastCGI_soft(避免重名)
• 勾选「仅限脚本」和「验证文件是否存在」 - 若跑 ThinkPHP/Laravel:在虚拟目录根下放
Web.config,内容含重写规则(stopProcessing="true"和url="index.php?{R:1}"不可省) - 授予
IIS_IUSRS对物理路径的「读取 & 执行」权限 - 检查
php.ini中cgi.fix_pathinfo=1,改完重启 IIS(不是重载)
Apache(Windows/Linux)
- 编辑
httpd.conf或站点vhost配置,在内添加:
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
- 注意:ThinkPHP/Laravel 类项目必须将
Alias指向public/子目录,不能指向项目根——否则.env、app/可被直接下载 - 确保
mod_rewrite已启用;public/.htaccess文件存在且内容为标准 TP6/Laravel 规则(含RewriteBase /myapp) - 重启 Apache(
httpd -k restart或服务管理)
Nginx(Windows/Linux)
- 在
server块内添加location块(结尾不加/):
location /myapp {
alias E:/www/myapp/public/;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 重点:
alias路径结尾必须带/;root不在此处设,靠$document_root自动继承;SCRIPT_FILENAME必须手动拼接 - 确认
php.ini中cgi.fix_pathinfo=1且cgi.force_redirect=0;改完需重启php-cgi.exe进程 - 重载 Nginx:
nginx -s reload
三、上线前必验的 4 个点
-
静态资源能否加载:访问
/myapp/css/style.css,看是否 404。若失败,大概率是alias或Directory权限未开 -
PHP 脚本能执行吗:在虚拟目录放一个
info.php(内容),访问/myapp/info.php。若报No input file specified,说明 FastCGI 映射未继承或cgi.fix_pathinfo错了 -
框架路由通不通:访问
/myapp/index.php/test(TP6)或/myapp/test(已配伪静态),看是否进控制器。不通就查Web.config/.htaccess/ Nginxrewrite是否生效、RewriteBase是否匹配别名 -
敏感文件防暴露:故意访问
/myapp/.env或/myapp/app/Http/Controllers/Controller.php,应返回 403 或 404。若能下载,说明 DocumentRoot 没对齐public/目录
四、常见报错速查表
• 502 Bad Gateway(Nginx)→ 检查 php-cgi 是否运行、fastcgi_pass 地址端口是否正确、SCRIPT_FILENAME 拼接是否漏 $document_root
• 403 Forbidden(IIS/Apache)→ 检查 IIS_IUSRS 或 www-data 权限、Directory AllowOverride 是否允许 .htaccess
• 404 Not Found(PHP 文件)→ 确认虚拟目录是否继承了 *.php 处理程序(IIS)、Alias 是否指向 public/(Apache)、alias 路径结尾是否有 /(Nginx)
• No input file specified → 90% 是 cgi.fix_pathinfo=0 或 SCRIPT_FILENAME 传了错误路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











