添加虚拟目录需同时满足apache定位路径、系统权限允许读取执行、且配置明确授权访问三条件,缺一即导致403/404或php源码下载;核心用alias配directory块,加require all granted和options followsymlinks,并确保php模块加载与addtype全局生效。

Apache 2.4.57 + PHP 7.4.33 添加虚拟目录,核心不是改个路径就完事,而是必须同时满足三件事:Apache 能定位到真实路径、有权限读取执行、且明确允许 Web 请求访问。漏掉任一环,浏览器就会 403、404 或直接下载 index.php 源码。
用 Alias 指令挂载非 DocumentRoot 下的目录
这是最常用也最安全的方式,适合把项目外的资源(如公共组件库、上传文件夹、静态资源 CDN 映射)暴露为 URL 路径。关键在 Alias 和配套的 <directory></directory> 块必须成对出现:
-
Alias /api-docs "D:/docs/swagger"—— 把本地D:/docs/swagger映射为http://localhost/api-docs - 紧跟着必须写
<directory></directory>,否则 Apache 2.4+ 默认拒绝所有请求 -
Require all granted不可省;Options FollowSymLinks要加,否则符号链接会 403 - 如果该目录下要跑 PHP(比如有个
render.php),还得补上AddType application/x-httpd-php .php(放在<directory></directory>外,全局或<ifmodule></ifmodule>内)
VirtualHost 里配多个 DocumentRoot?不行,得用 Directory + Alias 组合
Apache 不支持一个 <virtualhost></virtualhost> 里写多个 DocumentRoot。想让 http://crm.local/ 指向 C:/www/crm,同时 http://crm.local/assets 指向 E:/shared/assets,只能这样配:
- 主站点用
DocumentRoot "C:/www/crm"和对应<directory></directory> - 再加一段
Alias /assets "E:/shared/assets",并紧跟<directory></directory> - 别忘了在
<directory></directory>里写Require all granted,否则 Windows 下默认是 deny - 如果
E:/shared/assets里有.htaccess,而你没开AllowOverride All,那里面的重写规则不会生效
常见 403 错误:Windows 权限没同步给 Apache 运行账户
即使 Apache 配置全对,Windows 文件系统权限不对照样 403。Apache 2.4 在 Windows 上默认以 NT SERVICE\Apache24 账户运行(不是 SYSTEM,也不是当前登录用户):
- 右键目标目录(如
E:/shared/assets)→ 属性 → 安全 → 编辑 → 添加 → 输入NT SERVICE\Apache24→ 确定 - 勾选“读取和执行”、“列出文件夹内容”、“读取”;若需写入(如日志、上传),再加“写入”
- 务必勾选“替换子容器和对象的所有者”,否则子目录权限继承失败,尤其遇到嵌套
vendor/或node_modules/时必出问题 - PHP 脚本里调用
is_writable()返回 false?八成是这个账户没写权限,不是 Apache 配置问题
PHP 文件被当文本下载?检查 AddType 和 PHP 模块加载状态
浏览器打开 http://localhost/test.php 显示源码,说明 Apache 没把 .php 当作可执行脚本处理:
- 确认
LoadModule php7_module "D:/php/php7apache2_4.dll"已启用(路径必须绝对,且 DLL 存在) - 确认
AddType application/x-httpd-php .php已写在httpd.conf全局区,不能只写在某个<directory></directory>里 - 如果用了
Alias挂载的目录下有 PHP 文件,AddType必须全局生效;局部加AddType在<directory></directory>里无效 - 重启 Apache 后,访问
http://localhost/server-info(需启用mod_info)看 PHP 模块是否在 loaded modules 列表里
最容易被忽略的是:Alias 路径末尾不加斜杠,但真实目录路径末尾也不能带斜杠("D:/shared/assets" ✅,"D:/shared/assets/" ❌),Apache 2.4.57 对路径字符串校验更严格,多一个斜杠可能触发 400 或静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











