Apache需启用mod_alias和mod_vhost_alias模块,否则Alias和VirtualHost配置静默失效;须取消httpd.conf中对应LoadModule行的注释并重启服务。

确认 Apache 是否已启用 mod_alias 和 mod_vhost_alias
不启用这两个模块,Alias 和 VirtualHost 都会失效,但错误不会直接报在浏览器里,而是静默 404 或 500。打开 httpd.conf,检查以下两行是否取消注释:
LoadModule alias_module modules/mod_alias.soLoadModule vhost_alias_module modules/mod_vhost_alias.so
如果前面有 #,删掉;改完必须重启 Apache(httpd.exe -k restart 或服务面板操作),否则无效。
用 Alias 添加一个路径级虚拟目录(最常用)
适合把某个子路径(比如 /api、/upload)映射到非 DocumentRoot 下的任意位置,不用改 DNS 或 hosts。直接在 httpd.conf 末尾或 conf/extra/httpd-vhosts.conf 中添加:
<IfModule alias_module>
Alias "/myapp" "E:/projects/myapp"
<Directory "E:/projects/myapp">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</IfModule>
注意三点:
立即学习“PHP免费学习笔记(深入)”;
-
Alias第一个参数是 URL 路径(必须以/开头),第二个是磁盘绝对路径(Windows 用正斜杠或双反斜杠,避免单反斜杠被转义) -
<Directory>块里的路径必须和Alias的真实路径完全一致,否则权限不生效,访问时提示Forbidden - PHP7.2 默认不执行
.htaccess里的php_flag,如需覆盖 PHP 设置(如upload_max_filesize),得在<Directory>内加php_admin_value指令
用 VirtualHost 新建完整虚拟主机(需配 hosts 或 DNS)
适合多项目并行开发,每个项目用独立域名(如 local.myproject.test)。先在系统 hosts 文件加一行:127.0.0.1 local.myproject.test,再在 httpd-vhosts.conf 中写:
<VirtualHost *:80>
ServerName local.myproject.test
DocumentRoot "E:/projects/myproject/public"
<Directory "E:/projects/myproject/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
关键细节:
-
ServerName必须和hosts里写的完全一致(区分大小写、无端口、无协议) - Apache2.4+ 必须用
Require all granted,旧版的Allow from all会直接拒绝访问 - 若项目入口是
index.php但访问时显示目录列表,说明没启用mod_rewrite或没配DirectoryIndex—— 在<Directory>块内加一行:DirectoryIndex index.php index.html
路径含中文、空格或特殊字符时必踩的坑
Windows 下路径含中文或空格,Apache 启动可能不报错,但访问时返回 Internal Server Error 或空白页,错误日志里常出现 Invalid argument 或 Cannot map GET。根本原因是 Apache 对 URI 编码和路径解码处理不一致。
解决办法只有两个:
- 路径全用英文、数字、下划线,避免空格和中文(推荐)
- 若必须用中文路径,把整个路径用双引号包裹,并确保磁盘编码为 UTF-8(Windows 默认 GBK,需用工具转换或改注册表,风险高,不建议)
另外,DocumentRoot 和所有 <Directory> 中的路径,只要有一个含中文,整个虚拟主机都可能挂掉 —— 这个点容易被忽略,查日志前先看路径名。



















